Loop Java HashMap come Python dizionario?
-
01-10-2019 - |
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?
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).
-
iterare su
Map#entrySet()
:for (Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + "=" + entry.getValue()); }
-
iterare su
Map#keySet()
e quindi utilizzareMap#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));
}