Domanda

In Python, si può avere chiave, coppie di valori in un dizionario in cui è possibile scorrere di loro, come illustrato di seguito:

for k,v in d.iteritems():
    print k,v

C'è un modo per fare questo con Java HashMaps?

È stato utile?

Soluzione

Sì - per esempio:

Map<String, String> map = new HashMap<String, String>();
// add entries to the map here

for (Map.Entry<String, String> entry : map.entrySet()) {
    String k = entry.getKey();
    String v = entry.getValue();
    System.out.printf("%s %s\n", k, v);
}

Altri suggerimenti

Il HashMap.entrySet () restituirà fagioli di coppie di valori chiave, simili a dictionary.iteritems () . È quindi possibile ciclo attraverso di loro.

Credo che sia la cosa più vicina alla versione di Python.

Come mostrato nelle risposte, ci sono fondamentalmente due modi per iterare su un Map (supponiamo Map<String, String> in questi esempi).

  1. iterare su Map#entrySet() :

    for (Entry<String, String> entry : map.entrySet()) {
        System.out.println(entry.getKey() + "=" + entry.getValue());
    }
    
  2. iterare su Map#keySet() e quindi utilizzare Map#get() per ottenere il valore per ogni tasto:

    for (String key : map.keySet()) {
        System.out.println(key + "=" + map.get(key));
    }
    

Il secondo è forse più leggibile, ma ha un costo di prestazioni inutilmente get() chiamata su ogni iterazione. Un argomento può che creare il keyset iteratore è meno costoso, perché non ha bisogno di prendere in considerazione i valori. Ma che ci crediate o no, il keySet().iterator() crea e utilizza il stesso iteratore come entrySet().iterator(). L'unica differenza è che nel caso del keySet() chiamata next() dei rendimenti iteratori it.next().getKey() invece di it.next().

Il javadoc di AbstractMap#keySet() dimostra questo:

  

metodo iteratore del sottoclasse restituisce un "oggetto wrapper" nel corso di questa mappa iteratore entrySet().

Il codice sorgente AbstractMap dimostra anche questo. Ecco un estratto del metodo di keySet() (da qualche parte attorno alla riga 300 in Java 1.6):

public Iterator<K> iterator() {
    return new Iterator<K>() {
        private Iterator<Entry<K,V>> i = entrySet().iterator(); // <-----

        public boolean hasNext() {
            return i.hasNext();
        }

        public K next() {
            return i.next().getKey(); // <-----
        }

        public void remove() {
            i.remove();
        }
    };
}

Si noti che la leggibilità dovrebbe essere preferito su ottimizzazione prematura, ma è importante avere questo in mente.

Set<Map.Entry> set = d.entrySet();
for(Map.Entry i : set){
  System.out.println(i.getKey().toString() + i.getValue().toString);
}

Una cosa del genere ...

In Java, è possibile fare la stessa cosa simile alla seguente.

    HashMap<String, String> h = new HashMap<String, String>();
    h.put("1","one");
    h.put("2","two");
    h.put("3","three");

    for(String key:h.keySet()){
        System.out.println("Key: "+ key + " Value: " + h.get(key));
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top