Wenn eine HashMap verwenden, sind Werte und Schlüssel garantiert in der gleichen Reihenfolge sein, wenn Iterieren?

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

  •  02-07-2019
  •  | 
  •  

Frage

Wenn ich über die Werte oder Schlüssel laufen werden sie korrelieren? Wird die zweite Schlüsselkarte auf den zweiten Wert?

War es hilfreich?

Lösung

Nein, nicht unbedingt. Sie sollten wirklich die entrySet () verwenden. Iterator () für diesen Zweck. Mit diesem Iterator, werden Sie in der Karte durch alle Map.Entry Objekte zu Fuß und können jede Taste und zugehörigen Wert zugreifen.

Andere Tipps

die entrySet zu verwenden, die @Cuchullain erwähnt:

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
}

Sie wollen, dass diese verwenden, LinkedHashMap , für predicable Iterationsreihenfolge

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

Die beiden Werte () und keySet () Delegierter der entrySet () Iterator so werden sie in derselben Reihenfolge zurückgegeben werden. Aber wie Alex sagt, dass es viel besser ist, die entrySet () Iterator direkt zu verwenden.

Ich bin mit pmac72. Gehen Sie nicht davon, dass Sie Werte oder Schlüssel aus einer ungeordneten Sammlung bestellt erhalten werden. Wenn es an der Zeit zu Zeit funktioniert, ist es nur reine Gefahr. Wenn Sie bestellen, zu konservierenden wollen verwenden, um eine LinkedHashMap oder eine TreeMap oder commons Sammlungen OrderedMap.

Die Frage verwirrte mich zunächst aber @ Matt klären für mich.

Betrachten Sie die entrySet () Methode verwendet, die einen Satz mit den Schlüssel-Wert-Paaren auf der Karte zurück.

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());
}

Diese Ausgänge:

1 => 2
2 => 3
3 => 3

I @basszero Sekunde. Während

for (Map.Entry<Integer, Integer> entry : a.entrySet()) 

funktioniert, finde ich eine Datenstruktur, die dies automatisch tut, ist schöner. Jetzt können Sie nur iterieren „normal“

HashMap die keySet Methode gibt einen Satz, der nicht um garantiert.
HashMap Werte () Methode gibt eine Collection, die nicht um gewährleistet.

Wie gesagt, war die Frage, „werden sie korrelieren“, so technisch ist die Antwort vielleicht, aber verlassen Sie sich nicht darauf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top