2011-02-10 17 views
5

Estoy ejecutando un programa de comparación y en el momento hace una comparación directa de "cadena a cuerda" y si son una coincidencia exacta da como resultado que coinciden.¿Hay algo así como un carácter comodín en Java?

Bueno, yo tenía la esperanza de añadir una función adicional que permitió la 'similitud' ...

así por ejemplo:

String em1 = "52494646"; 
String em2 = "52400646"; 


if (em1.equals(em2)){ 
    output.writeUTF(dir + filenames[i]); 
} 

Esta es una especie de fragmento de código. Me gustaría que se salte el "00" y todavía lo reconozca como "casi" el mismo número y aún así lo emita.

me imagino que sería algo como String em2 = "524"+ ## +"646" pero eso es obviamente sólo un concepto

¿Alguien sabe si hay una manera de tener este tipo de 'comodín' (un término que he recogido de uni SQL) o si hay otra forma de hacer este trato de tipo de similitud.

Gracias :)

Respuesta

11

se pueden utilizar expresiones regulares:

if (em1.matches("524[0-9]{2}646")) { 
    // do stuff 
} 
+0

¿podría hacerse esto también con letras, como en los caracteres hexadecimales A-F? – user585522

+0

Sí, [expresiones regulares] (http://en.wikipedia.org/wiki/Regular_expression) pueden hacer eso y ** mucho ** más (ver http://www.regular-expressions.info/ para algunos realmente buena información sobre expresiones regulares). –

+0

y presumiblemente necesito descargar esta cosa de expresiones regulares? ¿O viene con el kit de desarrollo de Java estándar? – user585522

6

se puede resolver fácilmente usando expresiones regulares:

if (em1.matches("524..646")) 

por ejemplo.

(El . es un comodín que significa any character. Se podría reemplazarlo con \\d si se quiere restringir el comodín de dígitos.)

Aquí es una variante más general que coincida con "0" en contra de cualquier carácter :

String em1 = "52494646"; 
String em2 = "52400646"; 

if (em1.matches(em2.replaceAll("0", "\\\\d"))){ 
    System.out.println("Matches"); 
} 
+1

Tu nota me recuerda a mi viejo ordenador ... –

+0

1 y me recuerda la corriente uno, todavía no viejo :) – fmucar

+0

@ ring0, gracias. Me recuerda que es hora de volver al trabajo;) – aioobe

1

Por lo general, se puede hacer una combinación de estrellas tsWith, endsWith o contains para encontrar si un String start with termina con o contiene otra cadena. Puede utiliza estos en combinación como

number.startsWith("524") && number.endsWith("646"); 

utilizando una expresión regular es probable que sea una mejor opción el 95% del tiempo, pero es más caro.

0

Bueno, desafortunadamente, creo que apache commons StringUtil no tiene ninguna operación de comodín.

Si no recuerdo mal, hay una clase StringUtils en el conector mysql JDBC que tiene un método para comparar cadenas con comodines.

-O -

Puedes probar a utilizar una lógica de pelusa: http://jfuzzylogic.sourceforge.net/html/index.html

1

Creo que el problema con la solución RE antes mencionado es que no está interesado en números que son idénticos, pero para el tercero o 4ª posición, pero en números que son idénticos pero para uno/dos dígitos.

Cuál es un problema un poco más intrincado, pero básicamente desea calcular el http://en.wikipedia.org/wiki/Hamming_distance para sus dos cadenas. Algoritmo bien conocido para muchos problemas, por lo que debería encontrar muchos ejemplos, pero me temo que la biblioteca estándar no lo hará. También es un bucle y un contador, por lo que no debería tener problemas con una implementación: pierde cierto potencial de optimización que el STL puede usar (comparando las direcciones de las dos cadenas y tiene que comparar toda la cadena en ambos casos), pero no mucho más

0

¿Por qué las personas son reacias a simplemente escribir un algoritmo directo & simple?

boolean equals(String s1, String s2, char wildcard) 

    if(s1.length() != s2.length()) 
     return false; 

    for(int i=0; i<s1.length(); i++) 
     char c1 = s1.charAt(i), c2 = s2.charAt(i); 
     if(c1!=wildcard && c2!=wildcard && c1!=c2) 
      return false; 

    return true; 
+1

tal vez porque crear cosas genéricas es la mejor manera de escribir código. utilizando expresiones regulares tenemos una gran capacidad de escritura, pero generamos una (poca) falta de capacidad de lectura. Pero aún debemos crear más de una expresión para manejar diferentes casos. El uso de la lógica difusa es muy genérico y puede manejar todos los casos. usar un algoritmo directo manejará solo una situación específica particular. – bluefoot

0

Si está buscando una manera diferente de expresar un comodín, aquí es una opción:

String em1 = "52494646"; 
    String em2 = "52400646"; 

    if (em2.startsWith("524")){ 
     output.writeUTF(dir + filenames[i]); 
    } 
Cuestiones relacionadas