2013-05-21 8 views
12

Attualmente sto usando HashMap<String, Integer> che è pieno di chiavi di tipo String che sono tutte, diciamo, 5 caratteri lunghi. Come posso cercare una chiave specifica di 4 caratteri o meno, che è parte e all'inizio di alcuni altri tasti e ottenere tutti i riscontri come una raccolta di <Key, Value>?HashMap <String, Integer> Cerca una parte di una chiave?

+6

Bisogna scorrere tutta la HashMap, usare 'getKey.length()' e aggiungere o meno (a seconda della condizione) per un 'List <>' –

+0

Hai guardato 'keySet()'? – vikingsteve

+1

E 'troppo difficile da risolvere, se sì per te, allora almeno condividi quello che hai provato finora? –

risposta

20

Itera è l'unica opzione a meno che non si crea una struttura di dati personalizzati:

for (Entry<String, Integer> e : map.entrySet()) { 
    if (e.getKey().startsWith("xxxx")) { 
     //add to my result list 
    } 
} 

Se avete bisogno di qualcosa di più tempo efficiente, allora avresti bisogno di un'implementazione di mappa in cui si traccia questi tasti parziali.

0

Con HashMap<String, Integer> è possibile passare solo attraverso keySet() e fare per String chiavi e il modello.

4

Non è possibile farlo tramite HashMap, è necessario scrivere la propria implementazione per Map per l'implementazione della ricerca basata sulla lunghezza della stringa in una mappa.

+0

Salvo il caso, cambia i requisiti, usa la chiave con solo 4 caratteri e memorizza gli altri dati in un oggetto in valore. Un'altra opzione è utilizzare un oggetto chiave personalizzato, con metodo hashCode() personalizzato. –

+0

Non consiglierei di far rotolare la propria mappa <>. Probabilmente è eccessivo (e, inoltre, la composizione è spesso migliore dell'eredità). Tuttavia, sono d'accordo sul fatto che la struttura dei dati, così com'è, non è progettata per farlo. –

+0

Non è necessario implementare tutta la mappa. È abbastanza facile aggiungere oggetti extra se si utilizza il modello decoratore. Quindi ad esempio voglio disconnettere ogni chiave aggiunta a una mappa? Bene, eseguo la mia mappa dell'applicazione LoggingMap e quindi devi fornire l'istanza effettiva della mappa che sta per uscire. Ciò funzionerebbe perfettamente in questo caso, tranne che per il logging avresti tenuto traccia delle chiavi che desideri in una lista o qualcosa del genere. – cyborg

1

Ad esempio:

public static void checkMap(Map mp) { 
    Iterator it = mp.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry pairs = (Map.Entry)it.next(); 
     System.out.println(pairs.getKey().toLowerCase().contains("YourString")) 
     } 
} 

Questo codice stamperà vero per coloro keys che contengono il tuo substring.

+0

Ho bisogno di toLowerCase()? Le mie maiuscole sono sensibili al maiuscolo e minuscolo – Machtl

+0

Non lo fai, ma eseguire lowerCase() è sempre una buona pratica;) –

3
Map<String, Integer> result = new HashMap<String, Integer>; 
for(String key : yourMap.keySet()) { 
    if(key.length() == 4){ 
     result.put(key, yourMap.get(key); 
    } 
} 

Dopo l'esecuzione di questo codice si dispone di tutte le coppie chiave/valore con 4 tasti delle lettere in result.

1

Prima ottenere la voce impostata sulla hashmap. Scorri il set e controlla la lunghezza di ogni tasto e aggiungilo a una mappa o usalo come vuoi tu.

4

Sembra un caso d'uso per TreeMap anziché HashMap. La differenza è che TreeMap conserva l'ordine. Quindi puoi trovare la tua partita parziale molto più veloce. Non devi passare attraverso l'intera mappa.

controllare questa domanda Partial search in HashMap

0

Come è stato notato, non c'è un terribilmente efficace * modo di farlo con la datastructure è stato specificato. Tuttavia, se aggiungi un ulteriore Map<Integer, List<String>> per tenere traccia del mapping dalla lunghezza della stringa alla lista di tutte le chiavi con quella lunghezza, allora sarai in grado di farlo in modo molto efficiente.

* Usando solo la stringa Mappa <, Integer >, si avrebbe bisogno di scorrere l'intera capacità della mappa più grande, mentre l'aggiunta di questa datastructure supplementare imporrebbe un O (1) lookup (supponendo che è stato utilizzato un HashMap) seguito per iterazione attraverso il solo set di risultati, che è il risultato più veloce possibile.

0

Si può provare questo approccio:

public Map<String,Integer> filterMap(Map<String, Integer> inputMap){ 
    Map<String, Integer> resultHashMap = new HashMap<String, Integer>(); 
     for (String key : inputMap.keySet()) { 
      if(key.length()==5){ 
       resultHashMap.put(key,inputMap.get(key)); 
      } 
     } 
     return resultHashMap; 
    } 
Problemi correlati