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
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.
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);
È 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());
}
}
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; }
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.
risposta molto bella (+1) –
@ user426344: controlla anche questo [blog sul completamento automatico] (http://sujitpal.blogspot.com/2007/02/three-autocomplete-implementations.html) – Emil
- 1. Come cercare stringa LIKE 'qualcosa%' con Java Spring Framework?
- 2. Come fare "NOT LIKE" SQL in Slick
- 3. Hash Map in Python
- 4. Come implementare un operatore simile a SQL in Java?
- 5. Come posso introdurre più condizioni in operatore LIKE
- 6. Come utilizzare l'operatore "LIKE" SQL in SLICK
- 7. Come può LIKE '% ...' cercare su un indice?
- 8. SQL Come operatore in ruby su rotaie
- 9. xQuery operatore LIKE?
- 10. Dynamic-Hash-like-data structure in Fortran
- 11. Come cercare in Elasticsearch
- 12. C-like enum in Java
- 13. Converti struttura dati MIDI in Java (Elenco, Hash Map, ???)
- 14. Emulazione SQL LIKE in JavaScript
- 15. Come cercare annotazioni in eclipse java search
- 16. = * operatore in sql
- 17. Come cercare in redis per le chiavi hash?
- 18. Collezioni Java-like in PHP
- 19. Linq2SQL per produrre operatore Like
- 20. Come inserire hash in hash in Perl
- 21. Java?: Operatore in vb.net
- 22. - -> - - operatore in Java
- 23. pipe (|) operatore in Java
- 24. come usare un like con un join in sql?
- 25. Utilizzo di [like] come nella clausola in SQL?
- 26. come utilizzare facilmente molte condizioni LIKE in SQL?
- 27. operatore JavaScript simile a SQL "come"
- 28. Map to String in Java
- 29. SQL Where Clausola con LIKE e IN
- 30. È possibile utilizzare "NOT LIKE" in sql
Suona come una cattiva idea per me. Per una semplice ricerca di prefissi, regex è eccessivo ... cosa c'è di sbagliato in 'String.startsWith'? –
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). –
@ 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() ') –