Sortieren Sie eine HashMap in Java

1. Einleitung

In diesem kurzen Tutorial erfahren Sie, wie Sie eine HashMap in Java sortieren .

Im Einzelnen werden wir HashMap- Einträge nach ihrem Schlüssel oder Wert sortieren, indem wir Folgendes verwenden:

  • Baumkarte
  • ArrayList und Collections.sort ()
  • TreeSet
  • Unter Verwendung des Stream - API , und schließlich,
  • Mit Hilfe der Guava - Bibliothek

2. Verwenden einer TreeMap

Wie wir wissen, werden Schlüssel in TreeMap in ihrer natürlichen Reihenfolge sortiert . Dies ist eine gute Lösung, wenn wir die Schlüssel-Wert-Paare nach ihrem Schlüssel sortieren möchten. Die Idee ist also, alle Daten aus unserer HashMap in die TreeMap zu übertragen .

Definieren wir zunächst eine HashMap und initialisieren sie mit einigen Daten:

Map map = new HashMap(); Employee employee1 = new Employee(1L, "Mher"); map.put(employee1.getName(), employee1); Employee employee2 = new Employee(22L, "Annie"); map.put(employee2.getName(), employee2); Employee employee3 = new Employee(8L, "John"); map.put(employee3.getName(), employee3); Employee employee4 = new Employee(2L, "George"); map.put(employee4.getName(), employee4);

Für die Mitarbeiter - Klasse, beachten Sie, dass wir implementiert haben Vergleichbar :

public class Employee implements Comparable { private Long id; private String name; // constructor, getters, setters // override equals and hashCode @Override public int compareTo(Employee employee) { return (int)(this.id - employee.getId()); } }

Als nächstes speichern wir die Einträge in der TreeMap mithilfe ihres Konstruktors:

TreeMap sorted = new TreeMap(map);

Oder die putAll- Methode zum Kopieren der Daten:

TreeMap sorted = new TreeMap(); sorted.putAll(map);

Und das ist es! Um sicherzustellen, dass unsere Karteneinträge nach Schlüsseln sortiert sind, drucken wir sie aus:

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

Wie wir sehen, sind die Schlüssel in natürlicher Reihenfolge sortiert.

3. Verwenden von ArrayList

Natürlich können wir die Einträge der Karte mit Hilfe von ArrayList sortieren . Der Hauptunterschied zur vorherigen Methode besteht darin, dass wir die Map- Schnittstelle hier nicht pflegen .

3.1. Nach Schlüssel sortieren

Laden wir den Schlüsselsatz in eine ArrayList :

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

Und die Ausgabe ist:

[Annie, George, John, Mher]

3.2. Nach Wert sortieren

Was ist nun, wenn wir unsere Kartenwerte nach dem ID- Feld des Employee- Objekts sortieren möchten ? Auch dafür können wir eine ArrayList verwenden .

Kopieren wir zunächst die Werte in die Liste:

List employeeById = new ArrayList(map.values());

Und danach sortieren wir es:

Collections.sort(employeeById);

Denken Sie daran, dass dies funktioniert, da Employee die Schnittstelle Comparable implementiert . Andernfalls müssten wir einen manuellen Komparator für unseren Aufruf von Collections.sort definieren .

Um die Ergebnisse zu überprüfen, drucken wir die employeeById :

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

Wie wir sehen, werden die Objekte nach ihrem ID- Feld sortiert .

4. Verwenden eines TreeSet

Für den Fall, dass wir keine doppelten Werte in unserer sortierten Sammlung akzeptieren möchten, gibt es mit TreeSet eine gute Lösung .

Fügen wir zunächst einige doppelte Einträge zu unserer ursprünglichen Karte hinzu:

Employee employee5 = new Employee(1L, "Mher"); map.put(employee5.getName(), employee5); Employee employee6 = new Employee(22L, "Annie"); map.put(employee6.getName(), employee6);

4.1. Nach Schlüssel sortieren

So sortieren Sie die Karte nach ihren Schlüsseleinträgen:

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

Drucken wir das keySet und sehen die Ausgabe:

[Annie, George, John, Mher]

Jetzt haben wir die Kartenschlüssel ohne die Duplikate sortiert.

4.2. Nach Wert sortieren

Ebenso sieht der Konvertierungscode für die Kartenwerte wie folgt aus:

SortedSet values = new TreeSet(map.values());

Und die Ergebnisse sind:

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

Wie wir sehen können, enthält die Ausgabe keine Duplikate. Dies funktioniert mit benutzerdefinierten Objekten, wenn wir equals und hashCode überschreiben .

5. Verwenden von Lambdas und Streams

Seit Java 8 können wir die Map mithilfe der Stream-API und der Lambda-Ausdrücke sortieren . Wir müssen lediglich die sortierte Methode über die Stream- Pipeline der Karte aufrufen .

5.1. Nach Schlüssel sortieren

Zum Sortieren nach Schlüsseln verwenden wir den compareByKey- Komparator:

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

Die letzte forEach- Phase druckt die Ergebnisse aus:

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

Standardmäßig ist der Sortiermodus aufsteigend.

5.2. Nach Wert sortieren

Natürlich können wir auch nach den Employee- Objekten sortieren :

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

As we see, the code above prints out a map sorted by the id fields of Employee objects:

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

Additionally, we can collect the results into a new map:

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

Note that we collected our results into a LinkedHashMap. By default, Collectors.toMap returns a new HashMap, but as we know, HashMap doesn't guarantee iterationorder, while LinkedHashMap does.

6. Using Guava

Lastly, a library that allows us to sort the HashMap is Guava. Before we start, it'll be useful to check our write-up about maps in Guava.

Lassen Sie uns zunächst eine Bestellung deklarieren, da wir unsere Karte nach dem ID- Feld des Mitarbeiters sortieren möchten :

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

Jetzt müssen wir nur noch ImmutableSortedMap verwenden , um die Ergebnisse zu veranschaulichen:

ImmutableSortedMap.copyOf(map, naturalOrdering);

Und wieder ist die Ausgabe eine Karte, die nach dem ID- Feld geordnet ist:

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

7. Zusammenfassung

In diesem Artikel haben wir verschiedene Möglichkeiten zum Sortieren einer HashMap nach Schlüssel oder Wert untersucht.

Und wir haben einen genauen Blick auf , wie wir dies tun können , wenn das Attribut eine benutzerdefinierte Klasse ist durch die Implementierung Vergleichbare .

Schließlich ist der während der Diskussion verwendete Code wie immer auf GitHub zu finden.