Java >> Java tutorial >  >> Tag >> HashMap

Få den første nøgle og værdi fra et HashMap

1. Oversigt

I dette selvstudie vil vi diskutere, hvordan man får det første nøgle-værdi-par fra et HashMap uden at kende nøglen.

Først bruger vi en iterator og derefter en stream for at få den første indgang. Til sidst vil vi diskutere et problem med HashMap præsenterer, hvornår vi ønsker at få det første indlæg, og hvordan det løses.

2. Brug af en iterator

Lad os overveje, at vi har følgende HashMap :

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

I dette eksempel bruger vi en iterator for at få det første nøgle-værdi-par. Så lad os oprette en iteratorindtastningssættet af HashMap og kald next() metode til at hente den første post:

Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();

Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(1, "B");

assertEquals(expectedValue, actualValue);

3. Brug af en Java Stream

En anden tilgang er at bruge Java Stream API. Lad os oprette en strøm på indgangssættet og kald findFirst() metode til at få sin første indtastning:

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

assertEquals(expectedValue, actualValue);

4. Problem med indsættelsesrækkefølgen

For at præsentere dette problem, lad os huske, hvordan vi oprettede hashMap , parret 5=A blev indsat som den første post, derefter  1=B og til sidst 2=C . Lad os tjekke dette ved at udskrive indholdet af vores HashMap :

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

Som vi kan se, er bestilling ikke det samme. HashMap-klassen implementering garanterer ikke indsættelsesrækkefølgen .

Lad os nu tilføje et element mere til hashMap :

hashMap.put(0, "D");

Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();

Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(0, "D");

assertEquals(expectedValue, actualValue);

Som vi kan se, er den første post ændret igen (til 0=D I dette tilfælde). Dette beviser også, at HashMap garanterer ikke en indsættelsesrækkefølge.

hvis vi ønsker at bevare rækkefølgen, bør vi bruge et LinkedHashMap i stedet :

Map<Integer, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(5, "A");
linkedHashMap.put(1, "B");
linkedHashMap.put(2, "C");
linkedHashMap.put(0, "D");

Iterator<Map.Entry<Integer, String>> iterator = linkedHashMap.entrySet().iterator();
Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(5, "A");

assertEquals(expectedValue, actualValue);

5. Konklusion

I denne korte artikel diskuterede vi forskellige tilgange til at få den første indgang fra et HashMap .

Det vigtigste at bemærke er, at HashMap implementering garanterer ikke nogen indsættelsesrækkefølge. Så hvis vi er interesserede i at bevare indsættelsesrækkefølgen, bør vi bruge et LinkedHashMap .

Kodeeksemplet er tilgængeligt på GitHub.


Java tag