2010-11-17 15 views
5

Quiero buscar un mapa hash dependiendo de la entrada del usuario. Supongamos que un usuario da el valor 'A', tengo que mostrarlo comenzando con el nombre de una compañía y si el usuario da el valor 'AB' tengo que mostrarlo comenzando con el nombre de la compañía AB. Estoy almacenando el nombre de la empresa en el mapa hashcómo buscar como el operador LIKe en sql en el hash map en java

Respuesta

3

Los mapas hash solo son realmente buenos para encontrar coincidencias exactas basadas en una idea de igualdad que puede correlacionarse adecuadamente.

dos opciones:

  • sólo tiene que ir con una lista lugar, y buscarla en forma lineal. Para cantidades relativamente pequeñas de datos, es probable que esto funcione absolutamente bien.
  • Buscar o implementar un trie (o árbol de prefijo) que básicamente comenzará en un nodo raíz y descenderá para cada carácter que el usuario haya tipeado - los resultados son todos nodos de punto final válidos debajo del nodo alcanzado al final del descenso entrada del usuario.
0

usted debe buscar en expresiones regulares (expresiones regulares)

http://download.oracle.com/javase/tutorial/essential/regex/

sus nombres de empresas son cadenas, puede utilizar

String regex = "A*"; 
myString.matches(regex); 
+3

Me parece una mala idea. Para una búsqueda simple de prefijos, regex es overkill ... ¿qué pasa con 'String.startsWith'? –

+0

Nada, pero la pregunta era cómo hacer LIKE, sugiero regex porque podría querer hacer una prueba más compleja más adelante. si es solo hacer: comenzar con la prueba, entonces sí y no es una exageración. ("sí" porque hay una manera más corta de escribirlo, "no" porque creo que Java usa también expresiones regulares para hacer esto en el fondo). –

+0

@ user440336 No, java itera sobre las matrices subyacentes, que es mucho más eficiente que regex. especialmente porque si usa 'String.matches()' varias veces, el mismo patrón se compila una y otra vez ('str.matches (pattern)' es un atajo para 'Pattern.compile (pattern) .matcher (str). matches() ') –

3

Puede recorrer el conjunto de claves y comprobar cada tecla . Por ejemplo:

final String searchPrefix = "AB"; 
for(String key : map.keySet()){ 
    if(key.startsWith(searchPrefix)){ 
     System.out.println(map.get(key)); 
    } 
} 

O bien, puede recorrer las entradas en el mapa.

final String searchPrefix = "AB"; 
for(Entry<String,String> e : map.entrySet()){ 
    if(e.getKey().startsWith(searchPrefix)){ 
     System.out.println(e.getValue()); 
    } 
} 
10
  1. Utilice un NavigableSet.

    Ejemplo:

    NavigableSet<String> company=new TreeSet<String>(); 
    Set<String> filteredSet=company.tailSet(prefix); 
    for(String str:filteredSet) { 
    if(str.startsWith(prefix)) 
        //add to list 
    else 
        break; 
    } 
    
  2. Utilice un radix tree[wiki] o trie[wiki] si usted está preocupado por rendimiento.Las árbol de radix es más eficiente de la memoria en comparación con un trie.

+0

muy buena respuesta (+1) –

+0

@ user426344: También consulte este [blog en autocompletado] (http://sujitpal.blogspot.com/2007/02/three-autocomplete-implementations.html) – Emil

Cuestiones relacionadas