Holen Sie sich den ersten Schlüssel und Wert aus einer HashMap

1. Übersicht

In diesem Tutorial wird erläutert, wie Sie das erste Schlüssel-Wert-Paar aus einer HashMap abrufen, ohne den Schlüssel zu kennen.

Zuerst verwenden wir einen Iterator und dann einen Stream, um den ersten Eintrag zu erhalten. Abschließend werden wir ein Problem diskutieren, das die HashMap darstellt, wenn wir den ersten Eintrag erhalten möchten, und wie es gelöst werden kann.

2. Verwenden eines Iterators

Nehmen wir an, wir haben die folgende HashMap :

Map hashMap = new HashMap(); hashMap.put(5, "A"); hashMap.put(1, "B"); hashMap.put(2, "C");

In diesem Beispiel verwenden wir einen Iterator , um das erste Schlüssel-Wert-Paar zu erhalten. Erstellen wir also einen Iterator für den Eintragssatz der HashMap und rufen die next () -Methode auf, um den ersten Eintrag abzurufen:

Iterator
    
      iterator = hashMap.entrySet().iterator(); Map.Entry actualValue = iterator.next(); Map.Entry expectedValue = new AbstractMap.SimpleEntry(1, "B"); assertEquals(expectedValue, actualValue);
    

3. Verwenden eines Java-Streams

Ein anderer Ansatz ist die Verwendung der Java Stream-API. Erstellen wir einen Stream für den Eintragssatz und rufen die findFirst () -Methode auf, um den ersten Eintrag abzurufen :

Map.Entry actualValue = hashMap.entrySet() .stream() .findFirst() .get(); 
Map.Entry expectedValue = new AbstractMap.SimpleEntry(1, "B"); assertEquals(expectedValue, actualValue);

4. Problem mit der Einfügereihenfolge

Um dieses Problem zu präsentieren, erinnern wir uns , wie wir geschaffen Hashmap , das Paar 5 = A wurde als erster Eintrag eingefügt, dann 1 = B und schließlich 2 = C . Lassen Sie uns dies überprüfen, indem Sie den Inhalt unserer HashMap drucken :

System.out.println(hashMap);
{1=B, 2=C, 5=A}

Wie wir sehen können, ist die Bestellung nicht dieselbe. Die Implementierung der HashMap-Klasse garantiert nicht die Einfügereihenfolge .

Fügen wir jetzt ein weiteres Element zu hashMap hinzu :

hashMap.put(0, "D"); Iterator
    
      iterator = hashMap.entrySet().iterator(); Map.Entry actualValue = iterator.next(); Map.Entry expectedValue = new AbstractMap.SimpleEntry(0, "D"); assertEquals(expectedValue, actualValue);
    

Wie wir sehen können, hat sich der erste Eintrag erneut geändert ( in diesem Fall auf 0 = D. ). Dies beweist auch, dass HashMap keine Einfügereihenfolge garantiert.

Also, wenn wir den Auftrag erhalten wollen, sollten wir eine verwenden LinkedHashMap statt :

Map linkedHashMap = new LinkedHashMap(); linkedHashMap.put(5, "A"); linkedHashMap.put(1, "B"); linkedHashMap.put(2, "C"); linkedHashMap.put(0, "D"); Iterator
    
      iterator = linkedHashMap.entrySet().iterator(); Map.Entry actualValue = iterator.next(); Map.Entry expectedValue = new AbstractMap.SimpleEntry(5, "A"); assertEquals(expectedValue, actualValue);
    

5. Schlussfolgerung

In diesem kurzen Artikel haben wir verschiedene Ansätze besprochen, um den ersten Eintrag von einer HashMap zu erhalten .

Der wichtigste Punkt ist, dass die Implementierung von HashMap keine Reihenfolge der Einfügung garantiert. Wenn wir also die Einfügereihenfolge beibehalten möchten , sollten wir eine LinkedHashMap verwenden .

Das Codebeispiel ist auf GitHub verfügbar.