2010-11-17 10 views
5

Voglio cercare una mappa hash a seconda dell'input dell'utente. Supponiamo che un utente fornisca il valore "A", che debba essere visualizzato a partire da un nome di società e se l'utente fornisce il valore "AB" che devo visualizzare iniziando con il nome della società AB. Sto memorizzando il nome della società in hash mapcome cercare come operatore LIKe in sql in hash map in java

risposta

3

Le mappe di hash sono davvero molto brave a trovare corrispondenze esatte basate su un'idea di uguaglianza che può essere opportunamente cancellata.

due opzioni:

  • Basta andare con una lista, invece, e cercare linearmente. Per quantità relativamente piccole di dati, è probabile che funzioni perfettamente.
  • Trova o implementa un trie (o albero di prefissi) che inizierà fondamentalmente da un nodo radice e discenderà per ogni carattere che l'utente ha digitato - i risultati sono tutti nodi di "nodo finale valido" sotto il nodo raggiunto alla fine della discesa del input dell'utente.
0

si dovrebbe guardare in regex (espressioni regolari)

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

vostri nomi di società sono stringhe quindi è possibile utilizzare

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

Suona come una cattiva idea per me. Per una semplice ricerca di prefissi, regex è eccessivo ... cosa c'è di sbagliato in 'String.startsWith'? –

+0

Niente, ma la domanda era come fare LIKE, suggerisco regex perché potrebbe voler fare test più complessi in seguito. se è solo per fare: startwith test allora sì e no è un overkill. ("sì" perché c'è un modo più breve per scriverlo, "no" perché penso che anche Java usi regex per farlo in background). –

+0

@ user440336 No, java esegue iterazioni sugli array di caratteri sottostanti, che è molto più efficiente della regex. specialmente dato che se usi 'String.matches()' più volte, lo stesso pattern viene compilato più e più volte ('str.matches (pattern)' è una scorciatoia per 'Pattern.compile (pattern) .matcher (str). matches() ') –

3

È possibile un loop all'interno di keyset e verificare ogni tasto . Ad esempio:

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

Oppure, è possibile scorrere le voci sulla mappa.

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

    Esempio:

    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. Utilizzare un radix tree[wiki] o trie[wiki] se siete preoccupati per performance.The radice dell'albero è più efficiente della memoria rispetto ad un trie.

+0

risposta molto bella (+1) –

+0

@ user426344: controlla anche questo [blog sul completamento automatico] (http://sujitpal.blogspot.com/2007/02/three-autocomplete-implementations.html) – Emil