Quando si utilizza una HashMap, i valori e le chiavi sono garantiti nello stesso ordine durante l'iterazione?
-
02-07-2019 - |
Domanda
Quando eseguo l'iterazione sui valori o sulle chiavi, sono correlati? La seconda chiave verrà mappata sul secondo valore?
Soluzione
No, non necessariamente. Dovresti davvero usare entrySet (). Iterator () per questo scopo. Con questo iteratore, attraverserai tutti gli oggetti Map.Entry nella mappa e potrai accedere a ogni chiave e valore associato.
Altri suggerimenti
per utilizzare la voce Imposta che @Cuchullain ha menzionato:
Map<String, String> map = new HashMap<String, String>();
// populate hashmap
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// your code here
}
Si desidera utilizzare questo, LinkedHashMap , per un ordine di iterazione prevedibile
public class Test {
public static void main(String[] args) {
HashMap <String,String> hashmap = new HashMap<String,String>();
hashmap.put("one", "1");
hashmap.put("two", "2");
hashmap.put("three", "3");
hashmap.put("four", "4");
hashmap.put("five", "5");
hashmap.put("six", "6");
Iterator <String> keyIterator = hashmap.keySet().iterator();
Iterator <String> valueIterator = hashmap.values().iterator();
while(keyIterator.hasNext()) {
System.out.println("key: "+keyIterator.next());
}
while(valueIterator.hasNext()) {
System.out.println("value: "+valueIterator.next());
}
}
}
key: two
key: five
key: one
key: three
key: four
key: six
value: 2
value: 5
value: 1
value: 3
value: 4
value: 6
Entrambi i valori () e keySet () delegano all'iteratore entrySet () in modo che vengano restituiti nello stesso ordine. Ma come dice Alex, è molto meglio usare direttamente l'iteratore entrySet ().
Sono d'accordo con pmac72. Non dare per scontato che otterrai valori o chiavi ordinati da una raccolta non ordinata. Se funziona di volta in volta è solo puro pericolo. Se vuoi che l'ordine venga preservato, usa una LinkedHashMap o una TreeMap o una raccolta ordinata di raccolte comuni.
La domanda inizialmente mi ha confuso ma @Matt mi ha chiarito.
Prendi in considerazione l'utilizzo del metodo entrySet () che restituisce un set con le coppie chiave-valore sulla mappa.
Map<Integer, Integer> a = new HashMap<Integer, Integer>(2);
a.put(1, 2);
a.put(2, 3);
for (Map.Entry<Integer, Integer> entry : a.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
Questo output:
1 => 2
2 => 3
3 => 3
I secondo @basszero. Mentre
for (Map.Entry<Integer, Integer> entry : a.entrySet())
funzionerà, trovo che usare una struttura di dati che lo fa automaticamente sia più bello. Ora puoi semplicemente iterare " normalmente "
Il metodo keySet di HashMap restituisce un set, che non garantisce l'ordine.
Il metodo valori () di HashMap restituisce una raccolta, che non garantisce l'ordine.
Detto questo, la domanda era "stanno andando a correlare" quindi tecnicamente la risposta è forse, ma non fare affidamento su di essa.