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:
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!!!
Adjunto | Tamaño |
---|---|
Pantalla1.jpg | 239.44 KB |
- Inicie sesión o regístrese para enviar comentarios
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: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 procesashola!
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