Domanda Esegui una HashMap [duplicato]


Possibile duplicato: 
Come iterare in modo efficiente su ogni voce in una "mappa"?

Qual è il modo migliore per scorrere gli elementi in a HashMap?


2827
2018-06-30 23:24


origine


risposte:


Iterate attraverso il entrySet() così:

public static void printMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        System.out.println(pair.getKey() + " = " + pair.getValue());
        it.remove(); // avoids a ConcurrentModificationException
    }
}

Leggi di più Map.


2835
2018-06-30 23:27



Se ti interessano solo i tasti, puoi scorrere il file keySet() della mappa:

Map<String, Object> map = ...;

for (String key : map.keySet()) {
    // ...
}

Se hai solo bisogno dei valori, usa values():

for (Object value : map.values()) {
    // ...
}

Infine, se si desidera sia la chiave che il valore, utilizzare entrySet():

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...
}

Un avvertimento: se si desidera rimuovere gli elementi a metà iterazione, è necessario farlo tramite un Iterator (vedi la risposta di karim79). Tuttavia, la modifica dei valori degli articoli è OK (vedi Map.Entry).


4119
2018-06-30 23:28



Estratto dal riferimento Come eseguire l'iterazione su una mappa in Java:

Esistono diversi modi per iterare su a Map in Java. Andiamo oltre i metodi più comuni e rivedere i loro vantaggi e svantaggi. Poiché tutte le mappe in Java implementano l'interfaccia Mappa, le seguenti tecniche funzioneranno per qualsiasi implementazione di mappa (HashMap, TreeMap, LinkedHashMap, Hashtable, eccetera.)

Metodo # 1: Iterazione delle voci utilizzando un ciclo For-Each.

Questo è il metodo più comune ed è preferibile nella maggior parte dei casi. Dovrebbe essere usato se hai bisogno sia di chiavi della mappa che di valori nel ciclo.

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Si noti che il ciclo For-Each è stato introdotto in Java 5, quindi questo metodo funziona solo nelle versioni più recenti della lingua. Anche un ciclo For-Each verrà lanciato NullPointerException se si tenta di iterare su una mappa che è nullo, quindi prima di iterare si dovrebbe sempre verificare la presenza di riferimenti null.

Metodo # 2: Iterazione su chiavi o valori utilizzando un ciclo For-Each.

Se hai bisogno solo di chiavi o valori dalla mappa, puoi eseguire iterazioni su keySet o valori invece di entrySet.

Map<Integer, Integer> map = new HashMap<Integer, Integer>();

// Iterating over keys only
for (Integer key : map.keySet()) {
    System.out.println("Key = " + key);
}

// Iterating over values only
for (Integer value : map.values()) {
    System.out.println("Value = " + value);
}

Questo metodo offre un leggero vantaggio in termini di prestazioni entrySet iterazione (circa il 10% più veloce) ed è più pulita.

Metodo # 3: Iterazione tramite Iterator.

Uso di Generics:

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry<Integer, Integer> entry = entries.next();
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Senza generici:

Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry entry = (Map.Entry) entries.next();
    Integer key = (Integer)entry.getKey();
    Integer value = (Integer)entry.getValue();
    System.out.println("Key = " + key + ", Value = " + value);
}

Puoi anche usare la stessa tecnica per iterare sopra keySet o valori.

Questo metodo potrebbe sembrare ridondante, ma ha i suoi vantaggi. Prima di tutto, è l'unico modo per scorrere su una mappa nelle versioni precedenti di Java. L'altra importante caratteristica è che è l'unico metodo che consente di rimuovere le voci dalla mappa durante l'iterazione chiamando iterator.remove(). Se provi a farlo durante l'iterazione For-Each otterrai "risultati imprevedibili" secondo Javadoc.

Dal punto di vista delle prestazioni, questo metodo è uguale a un'iterazione For-Each.

Metodo # 4: Iterazione su chiavi e ricerca di valori (inefficienti).

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
    Integer value = map.get(key);
    System.out.println("Key = " + key + ", Value = " + value);
}

Potrebbe sembrare un'alternativa più pulita per il metodo n. 1, ma in pratica è piuttosto lento e inefficiente in quanto l'acquisizione di valori da una chiave potrebbe richiedere molto tempo (questo metodo nelle diverse implementazioni di Map è più lento del 20% -200% rispetto al metodo n. 1 ). Se hai installato FindBug, lo rileverà e ti avviserà dell'iterazione inefficiente. Questo metodo dovrebbe essere evitato.

Conclusione:

Se hai bisogno solo di chiavi o valori dalla mappa, usa il metodo # 2. Se si è bloccati con una versione precedente di Java (meno di 5) o si prevede di rimuovere le voci durante l'iterazione, è necessario utilizzare il metodo # 3. Altrimenti usa il metodo # 1.


739
2017-12-08 14:19



È possibile scorrere le voci in a Map in diversi modi. Ottieni ogni chiave e valore in questo modo:

Map<?,?> map = new HashMap<Object, Object>();
for(Entry<?, ?> e: map.entrySet()){
    System.out.println("Key " + e.getKey());
    System.out.println("Value " + e.getValue());
}

Oppure puoi ottenere l'elenco delle chiavi con

Collection<?> keys = map.keySet();
for(Object key: keys){
    System.out.println("Key " + key);
    System.out.println("Value " + map.get(key));
}

Se desideri semplicemente ottenere tutti i valori e non sono interessati ai tasti, puoi utilizzare:

Collection<?> values = map.values();

77
2018-06-30 23:43



for (Map.Entry<String, String> item : params.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}

70
2017-07-23 01:28



Smarter:

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}

55
2017-08-11 10:01



Dipende. Se sai che avrai bisogno sia della chiave che del valore di ogni voce, allora passa attraverso entrySet. Se hai solo bisogno dei valori, allora c'è il values() metodo. E se hai solo bisogno delle chiavi, allora usa keyset().

Una cattiva pratica sarebbe quella di scorrere tutte le chiavi, e quindi all'interno del ciclo, sempre fare map.get(key) per ottenere il valore. Se lo fai, allora la prima opzione che ho scritto è per te.


40
2018-06-30 23:29