Få den første nøkkelen og verdien fra et HashMap

1. Oversikt

I denne opplæringen vil vi diskutere hvordan du får det første nøkkelverdiparet fra en HashMap uten å vite nøkkelen.

Først bruker vi en iterator, og deretter en strøm for å få den første oppføringen. Til slutt vil vi diskutere et problem HashMap presenterer når vi ønsker å få den første oppføringen og hvordan vi skal løse den.

2. Bruke en Iterator

La oss vurdere at vi har følgende HashMap:

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

I dette eksemplet bruker vi en iterator for å få det første nøkkelverdiparet. Så la oss lage en iteratoroppføringssett av HashMap og ring neste () metode for å hente den første oppføringen:

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

3. Bruke en Java Stream

En annen tilnærming er å bruke Java Stream API. La oss lage en strøm på oppføringssett og ring findFirst () metode for å få sin første oppføring:

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

4. Problem med innsettingsordren

For å presentere dette problemet, la oss huske hvordan vi opprettet hashMap, paret 5 = A ble satt inn som første oppføring, da 1 = B og endelig 2 = C. La oss sjekke dette ved å skrive ut innholdet på vårt HashMap:

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

Som vi kan se, er ikke bestilling det samme. De HashMap-klasse implementering garanterer ikke innsettingsordren.

La oss nå legge til ett element til hashMap:

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

Som vi kan se, har den første oppføringen endret seg igjen (til 0 = D i dette tilfellet). Dette beviser også det HashMap garanterer ikke en innsettingsordre.

Så, hvis vi ønsker å bevare ordren, bør vi bruke en LinkedHashMap i stedet:

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 expectValue = new AbstractMap.SimpleEntry (5, "A"); assertEquals (forventet verdi, faktisk verdi);

5. Konklusjon

I denne korte artikkelen diskuterte vi forskjellige tilnærminger for å få den første oppføringen fra a HashMap.

Det viktigste punktet å merke seg er at HashMap implementering garanterer ikke noen rekkefølge for innsetting. Så hvis vi er interessert i å bevare innsettingsordren, bør vi bruke en LinkedHashMap.

Kodeeksemplet er tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found