Quando si utilizza una HashMap, i valori e le chiavi sono garantiti nello stesso ordine durante l'iterazione?

StackOverflow https://stackoverflow.com/questions/128008

  •  02-07-2019
  •  | 
  •  

Domanda

Quando eseguo l'iterazione sui valori o sulle chiavi, sono correlati? La seconda chiave verrà mappata sul secondo valore?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top