style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Problema al comparar dos String

Hola buenos dias.
Tengo un problema al comparar dos Strings. Uno de estos String es una lectura por puerto serial y al querer compararla con otro String me devuelve false.
Trate de quitarle caractes especiales y espacios en blanco y hasta el momento no lo he logrado.

Este es mi código:

@Override
    public void serialEvent(SerialPortEvent event) {
        if (event.isRXCHAR() && (event.getEventValue() >= 17)) {
            //try {
            Runnable task2 = () -> {
                try {
                    String jk = "01050047923713F5"
                    StringBuilder n = new StringBuilder();
                    StringBuilder sb = new StringBuilder();//Variable para almacenar String del puerto
                    sb.append(serialPort.readString(event.getEventValue()));//Almaceno el String que me envia el puerto
                    String se = (String) sb.substring(0, sb.length() - 1);//Le quito un caracter que no nececito
                    System.out.println(se);
                    String[] palabras = se.split("^[A-Za-z_0-9]*");//Elimino caracteres especiales
                    for (String t : palabras) {
                        System.out.println(t);
                        n.append(t);//LO almaceno en una nueva variable
                    }
                    //Normalizo mi cadena a UTF-8
                    byte ptext[] = se.getBytes();
                    String value = new String(ptext, "UTF-8");
                    //Imprimo mi lectura en el Jtextfield
                    jTextField1.setText(n.toString().trim());
                    String yo = n.toString();//Convierto la variable n a String
                    System.out.println(se.length());//Checo que sea de igual de tamaño
                    System.out.println(jk.length());
                    //Comparo mi variable yo con el String de RFDI que tengo
                    if ( yo.equals(jk)) {
                        jTextArea1.append("Encontrada\n");
                    } else {
                        jTextArea1.append("No registrada\n");
                    }
                    Thread.sleep(6000);
                    jTextArea1.setText("");
                    sb.append("");
                    sb.setLength(0);
                    jTextField1.setText("");

                } catch (SerialPortException | InterruptedException | UnsupportedEncodingException ex) {
                    Logger.getLogger(Control.class.getName()).log(Level.SEVERE, null, ex);
                }
            };
            new Thread(task2).start();
        }
    }

Ojala me puedan ayudar, mil gracias!!!

AdjuntoTamaño
Pantalla1.jpg239.44 KB

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

optimizar?

De entrada creo que sb sobra; sólo lo usas para guardar la cadena que leíste y quitar un caracter. Eso lo puedes hacer sin el StringBuilder:

String delPuerto = readStringBlaBla();
delPuerto = delPuerto.substring(0,delPuerto.length()-1);

En segunda, creo que la conversión a UTF-8 debería ser lo primero que hagas, y no me parece que la manera que lo haces sea la correcta. De hecho si el método readString lo implementaste tú, ahí es donde deberías crear el String ya con el encoding deseado.

Si solamente ves el mensaje de "no encontrada", pues para saber qué salió mal, deberías imprimir la cadena resultante de lo que leíste del puerto. Según yo, lo que haces con la expresión regular está mal, porque lo que hace es partir la cadena usando cualquiera de los caracteres NO encontrados en ese conjunto que definiste (letras y números y subguión, básicamente). Por ejemplo si procesas la cadena que esperas  01050047923713F5, te sale una lista vacía. Si procesas hola! te sale una lista con dos elementos: una cadena vacía y el puro "!".

Creo que es un típico caso de "tengo un problema. Ya sé! usaré una expresión regular... y ahora tengo dos problemas".

Muchas gracias !!!! ezamudio.

Te agradezco mucho tu amable respuesta sobre el problema que tenía.
Pero ya lo logre solucionar y no se si es correcto lo que hice pero funciona con cualquier lectura que hago.

Asi quedo de momento mi código.

/**
     * * Método para detectar cuando llego un dato al puerto serial
     *
     **
     * @param event
     */

    @Override
    public void serialEvent(SerialPortEvent event) {

        if (event.isRXCHAR() && (event.getEventValue() >= 17)) {
            try {
                ldt = LocalDateTime.now();
                tiempo = Timestamp.valueOf(ldt);
                conne = Conectado.obtenerConexion();
                pstm = conne.prepareStatement(sentencia);
                Runnable task2 = () -> {
                    try {
                        final String NUM = "010500574803BAA2";//RF para verificar de prueba
                        StringBuilder sp = new StringBuilder();//Variable para almacenar String del puerto
                        StringBuilder sc = new StringBuilder();//Variable sin caracteres especiales.
                        sp.append(serialPort.readString(event.getEventValue()));//Almaceno el String que me envia el puerto
                        String se = (String) sp.substring(0, sp.length() - 1);//Le quito un caracter que no nececito
                        System.out.println("Imprimo la cadena leida del puerto serie: " + se + "El tamaño de la cadena es: " + se.length());
                        String[] palabras = se.split("^[A-Za-z_0-9]*");//Elimino caracteres especiales
                        for (String t : palabras) {
                            System.out.println(t);
                            sc.append(t);//Lo almaceno en una nueva variable
                        }
                        String cadRes = sc.toString().trim();//Covierto la variable n a String
                        boolean g = cadRes.equals(NUM);//Intento comparar los String
                        RF.setText(cadRes);
                        System.out.println(cadRes.length());//Checo que se ha igual de tamaño
                        System.out.println(NUM.length());
                        System.out.println(g);
                        //Comparo mi variable yo con
                        if (cadRes.equals(NUM)) {
                            jTextArea1.append("Encontrada\n");
                        } else {
                            jTextArea1.append("No registrada\n");
                        }
                        //Busco el registro de la base
                        pstm.setString(1, cadRes);
                        res = pstm.executeQuery();
                        /*Y muestro la información de
                        * aquien pertenece la rf
                         */

                        while (res.next()) {
                            String y = res.getString(1);
                            String ya = res.getString(2);
                            if (!y.isEmpty()) {
                                if (!ya.isEmpty()) {
                                    jLabel3.setText(y);
                                    eti.setText(ya);
                                    jTextArea1.append("Encontrada.......\n");
                                } else {
                                    eti.setText("Registro no encontrado...");
                                }
                            } else {
                                jLabel3.setText("No existe nombre");
                            }
                        }
                        Thread.sleep(2000);
                        jTextArea1.setText("");
                        sc.append("");
                        sc.setLength(0);
                        RF.setText("");
                        Nom.setText("");
                        jLabel3.setText("");
                        eti.setText("");

                    } catch (SerialPortException | InterruptedException | SQLException ex) {
                        Logger.getLogger(Control.class.getName()).log(Level.SEVERE, null, ex);
                    }
                };
                new Thread(task2).start();
            } catch (SQLException ex) {
                Logger.getLogger(Control.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Resultado en terminal

Imprimo la cadena leida del puerto serie: 010500574803BAA2El tamaño de la cadena es: 17
010500574803BAA2
16
16
true

Hasta el momento me funciona con varias tarjetas y las lee correctamente asi como la consulta a la base sin problemas :D

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">