2012-01-25 16 views

risposta

12

Questo può essere fatto con uno standard SortedMap:

Map<String,V> tailMap = myMap.tailMap(prefix); 
boolean result = (!tailMap.isEmpty() && tailMap.firstKey().startsWith(prefix)); 

mappe non scelti (per esempio HashMap) non supportano intrinsecamente ricerche di prefissi, quindi per quelle dovrai iterare su tutte le chiavi.

+1

Mentre sto usando una mappa di hash che raccolgo posso creare una mappa ad albero come segue: 'TreeMap treeMap = new TreeMap(); treeMap.putAll (HashMap); ' – Edd

+3

@Edd: O, ancora più semplice,' TreeMap treemap = new TreeMap (HashMap); ' – NPE

2

Dalla mappa, è possibile ottenere un set di chiavi, e nel caso in cui essi sono stringa, è possibile iterare sugli elementi del set e verificare la presenza di startsWith("abc")

+0

grazie, posso vedere che funzionerebbe anche se speravo di non dover iterare attraverso il set di chiavi – Edd

+0

@ Edd Perché no? È ottimizzato da java guys per essere usato in questo modo;) –

+0

risulta in una maggiore complessità ciclomatica a meno che non lo si estrae in un metodo separato e non abbia una classe ovvia per mettere un tale metodo in così speravo di non aver bisogno di creare una nuova classe di utilità per le mappe con un singolo metodo in ... sembra che io sia pigro quando lo dico, ma sarebbe d'aiuto se ci fosse un metodo di utilità pronto per questo ... pio desiderio) – Edd

0

Per costruire la risposta/commento di Adel Boutros sull'efficienza delle chiavi iterative, è possibile incapsulare l'iterazione della chiave in una sottoclasse o in un decoratore Map.

L'estensione HashMap fornisce una classe per inserire il metodo e mantenere il codice specifico della mappa fuori dal metodo, riducendo la complessità e rendendo il codice più naturale da leggere.

+0

Ciò significherebbe la mia HashMap avrebbe bisogno di essere un'istanza della HashMap estesa e vorrei devi eseguire un cast da Map (se la mappa è stata dichiarata come Map) per usare il metodo. Mette il codice in un posto ordinato ma probabilmente non sarebbe utilizzabile – Edd

+0

Sì. Oppure si può fare 'MyMapExtension m = new MyMapExtension (myMap);' Oppure si può andare con una soluzione decoratore per avvolgere la mappa. Entrambi dovrebbero leggere in modo simile alla tua idea originale. –

+0

Vedo ... Suppongo che l'opzione decoratore impedisca la creazione di una nuova istanza della mappa, quindi dovrebbe essere più efficiente – Edd

Problemi correlati