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.