Sorteer een HashMap in Java

1. Inleiding

In deze korte handleiding leren we hoe u dat moet doen sorteer een Hash kaart in Java.

Meer specifiek kijken we naar sortering Hash kaart items op hun sleutel of waarde met behulp van:

  • TreeMap
  • ArrayList en Collections.sort ()
  • TreeSet
  • De ... gebruiken Stroom API, en tenslotte,
  • De ... gebruiken Guave bibliotheek

2. Met behulp van een TreeMap

Zoals we weten, sleutels in TreeMap worden gesorteerd volgens hun natuurlijke volgorde. Dit is een goede oplossing als we de sleutel-waardeparen op hun sleutel willen sorteren. Dus het idee is om alle gegevens van ons te pushen Hash kaart in de TreeMap.

Laten we om te beginnen een Hash kaart en initialiseer het met wat gegevens:

Map map = nieuwe HashMap (); Werknemer werknemer1 = nieuwe werknemer (1L, "Mher"); map.put (werknemer1.getNaam (), werknemer1); Werknemer werknemer2 = nieuwe werknemer (22L, "Annie"); map.put (werknemer2.getNaam (), werknemer2); Werknemer werknemer3 = nieuwe werknemer (8L, "Jan"); map.put (werknemer3.getNaam (), werknemer3); Werknemer werknemer4 = nieuwe werknemer (2L, "George"); map.put (employee4.getName (), employee4);

Voor de Werknemer klasse, merk op dat we hebben geïmplementeerd Vergelijkbaar:

openbare klasse Werknemer implementeert vergelijkbare {privé lange id; private String naam; // constructor, getters, setters // overschrijven is gelijk aan en hashCode @Override public int CompareTo (Employee employee) {return (int) (this.id - employee.getId ()); }}

Vervolgens slaan we de vermeldingen op in het TreeMap door de constructor te gebruiken:

TreeMap gesorteerd = nieuwe TreeMap (kaart);

Of de zet alle methode om de gegevens te kopiëren:

TreeMap gesorteerd = nieuwe TreeMap (); gesorteerd.putAll (kaart);

En dat is het! Om er zeker van te zijn dat onze kaartvermeldingen op sleutel zijn gesorteerd, gaan we ze afdrukken:

Annie = Werknemer {id = 22, naam = "Annie"} George = Werknemer {id = 2, naam = "George"} John = Werknemer {id = 8, naam = "John"} Mher = Werknemer {id = 1, name = "Mher"}

Zoals we zien, zijn de sleutels in natuurlijke volgorde gesorteerd.

3. Met behulp van ArrayList

Natuurlijk kunnen we de vermeldingen op de kaart sorteren met behulp van ArrayList. Het belangrijkste verschil met de vorige methode is dat we onderhouden niet de Kaart interface hier.

3.1. Sorteer op sleutel

Laten we de sleutelset in een ArrayList:

List employeeByKey = nieuwe ArrayList (map.keySet ()); Collections.sort (employeeByKey);

En de output is:

[Annie, George, John, Mher]

3.2. Sorteer op waarde

Nu, wat als we onze kaartwaarden willen sorteren op de ID kaart gebied van Werknemer voorwerp? We kunnen een ArrayList ook daarvoor.

Laten we eerst de waarden naar de lijst kopiëren:

List employeeById = nieuwe ArrayList (map.values ​​());

En daarna sorteren we het:

Collections.sort (employeeById);

Onthoud dat dit werkt omdat Werknemer implementeert het Vergelijkbaar koppel. Anders zouden we een handmatige comparator moeten definiëren voor onze oproep naar Collections.sort.

Om de resultaten te controleren, printen we de medewerkerById:

[Werknemer {id = 1, naam = "Mher"}, Werknemer {id = 2, naam = "George"}, Werknemer {id = 8, naam = "John"}, Werknemer {id = 22, naam = "Annie "}]

Zoals we zien, zijn de objecten gesorteerd op hun ID kaart veld.

4. Met behulp van een TreeSet

Voor het geval we wil geen dubbele waarden accepteren in onze gesorteerde verzameling, daar zit een mooie oplossing bij TreeSet.

Laten we eerst enkele dubbele vermeldingen toevoegen aan onze oorspronkelijke kaart:

Werknemer werknemer5 = nieuwe werknemer (1L, "Mher"); map.put (employee5.getName (), employee5); Werknemer werknemer6 = nieuwe werknemer (22L, "Annie"); map.put (employee6.getName (), employee6);

4.1. Sorteer op sleutel

Om de kaart op basis van de belangrijkste ingangen te sorteren:

SortedSet keySet = nieuwe TreeSet (map.keySet ());

Laten we het sleutelbos en zie de output:

[Annie, George, John, Mher]

Nu hebben we de kaartsleutels gesorteerd zonder de duplicaten.

4.2. Sorteer op waarde

Evenzo ziet de conversiecode er voor de kaartwaarden als volgt uit:

SortedSet-waarden = nieuwe TreeSet (map.values ​​());

En de resultaten zijn:

[Werknemer {id = 1, naam = "Mher"}, Werknemer {id = 2, naam = "George"}, Werknemer {id = 8, naam = "John"}, Werknemer {id = 22, naam = "Annie "}]

Zoals we kunnen zien, zijn er geen duplicaten in de uitvoer. Dit werkt met aangepaste objecten wanneer we deze overschrijven is gelijk aan en hashCode.

5. Lambda's en streams gebruiken

Sinds Java 8 kunnen we de Stream API en lambda-expressies gebruiken om de kaart te sorteren. Het enige dat we nodig hebben, is het gesorteerd methode over de kaart stroom pijpleiding.

5.1. Sorteer op sleutel

Om op sleutel te sorteren, gebruiken we de comparingByKey comparator:

map.entrySet () .stream () .sorted (Map.Entry.comparingByKey ()) .forEach (System.out :: println);

De laatste voor elk stage drukt de resultaten af:

Annie = Werknemer {id = 22, naam = "Annie"} George = Werknemer {id = 2, naam = "George"} John = Werknemer {id = 8, naam = "John"} Mher = Werknemer {id = 1, name = "Mher"}

Standaard is de sorteermodus oplopend.

5.2. Sorteer op waarde

Natuurlijk kunnen we sorteren op de Werknemer objecten ook:

map.entrySet () .stream () .sorted (Map.Entry.comparingByValue ()) .forEach (System.out :: println);

Zoals we zien, drukt de bovenstaande code een kaart af gesorteerd op de ID kaart velden van Werknemer voorwerpen:

Mher = Werknemer {id = 1, naam = "Mher"} George = Werknemer {id = 2, naam = "George"} John = Werknemer {id = 8, naam = "John"} Annie = Werknemer {id = 22, name = "Annie"}

Bovendien kunnen we de resultaten verzamelen in een nieuwe kaart:

Kaartresultaat = map.entrySet () .stream () .sorted (Map.Entry.comparingByValue ()) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue, (oldValue, newValue) - > oldValue, LinkedHashMap :: nieuw));

Merk op dat we onze resultaten hebben verzameld in een LinkedHashMap. Standaard, Collectors.toMap geeft een nieuwe HashMap terug, maar zoals we weten, Hash kaart garandeert geen iteratiebestellen, terwijl LinkedHashMap doet.

6. Guava gebruiken

Ten slotte is er een bibliotheek waarmee we het Hash kaart is Guava. Voordat we beginnen, is het handig om ons artikel over kaarten in Guava te bekijken.

Laten we eerst een Bestellen aangezien we onze kaart willen sorteren op WerknemerID kaart veld:

Ordering naturalOrdering = Ordering.natural () .onResultOf (Functions.forMap (map, null));

Nu is alles wat we nodig hebben om te gebruiken ImmutableSortedMap om de resultaten te illustreren:

ImmutableSortedMap.copyOf (map, naturalOrdering);

En nogmaals, de uitvoer is een kaart gesorteerd op de ID kaart veld:

Mher = Werknemer {id = 1, naam = "Mher"} George = Werknemer {id = 2, naam = "George"} John = Werknemer {id = 8, naam = "John"} Annie = Werknemer {id = 22, name = "Annie"}

7. Samenvatting

In dit artikel hebben we een aantal manieren besproken om een Hash kaart op sleutel of op waarde.

En we hebben goed bekeken hoe we dit kunnen doen als het attribuut een aangepaste klasse is door te implementeren Vergelijkbaar.

Eindelijk, zoals altijd, is de code die tijdens de discussie is gebruikt, te vinden op GitHub.