Haal de eerste sleutel en waarde uit een HashMap

1. Overzicht

In deze zelfstudie bespreken we hoe u het eerste sleutel / waarde-paar uit een Hash kaart zonder de sleutel te kennen.

Eerst gebruiken we een iterator en vervolgens een stream om het eerste item te krijgen. Ten slotte bespreken we een probleem met de Hash kaart presenteert wanneer we de eerste invoer willen krijgen en hoe we deze kunnen oplossen.

2. Met behulp van een iterator

Laten we eens kijken dat we het volgende hebben Hash kaart:

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

In dit voorbeeld gebruiken we een iterator om het eerste sleutel / waarde-paar te krijgen. Laten we dus een iterator op de instapset van de Hash kaart en bel de De volgende() methode om het eerste item op te halen:

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

3. Met behulp van een Java-stream

Een andere benadering is om de Java Stream API te gebruiken. Laten we een stream maken op het instapset en bel de findFirst () methode om de eerste invoer te krijgen:

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

4. Probleem met de invoegopdracht

Laten we, om dit probleem te presenteren, onthouden hoe we hebben gemaakt hash kaart, het paar 5 = A is dan als eerste item ingevoegd 1 = B en tenslotte 2 = C. Laten we dit controleren door de inhoud van onze Hash kaart:

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

Zoals we kunnen zien, is bestellen niet hetzelfde. De HashMap-klasse implementatie garandeert de invoegvolgorde niet.

Laten we nu nog een element toevoegen aan hash kaart:

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

Zoals we kunnen zien, is de eerste invoer weer gewijzigd (naar 0 = D in dit geval). Dit bewijst ook dat Hash kaart garandeert geen invoegopdracht.

Zo, als we de volgorde willen behouden, moeten we een LinkedHashMap in plaats daarvan:

Map linkedHashMap = nieuwe 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 verwachteValue = nieuwe AbstractMap.SimpleEntry (5, "A"); assertEquals (verwachteValue, actualValue);

5. Conclusie

In dit korte artikel hebben we verschillende benaderingen besproken om de eerste vermelding van een Hash kaart.

Het belangrijkste punt om op te merken is dat Hash kaart implementatie garandeert geen enkele volgorde van invoeging. Dus als we geïnteresseerd zijn in het behouden van de invoegopdracht, moeten we een LinkedHashMap.

Het codevoorbeeld is beschikbaar op GitHub.