Sortieren einer HashMap nach dem Schlüssel in Java

Rashmi Patidar 12 Oktober 2023
  1. Sortieren Sie das Keyset mit der Klasse TreeMap in Java
  2. Sortieren des Keysets mit den Java 8-Funktionen
  3. Verstehen Sie die Stream-Funktion zur Karteninitialisierung in Java in
  4. Verstehen Sie die Map Transformation Stream-Funktion in Java
Sortieren einer HashMap nach dem Schlüssel in Java

Der Begriff HashMap in Java ist die Sammlung, die von der Map-Schnittstelle abgeleitet ist. Diese Sammlung oder Klasse ist im Paket java.util vorhanden und speichert die Daten in einem Schlüssel-Wert-Paar. Beachten Sie, dass es auf der Karte nicht zwei Schlüssel geben kann. Wenn der doppelte Schlüssel eingefügt wird, wird der Wert des jeweiligen Schlüssels durch den neueren Wert ersetzt.

Sortieren Sie das Keyset mit der Klasse TreeMap in Java

Unten ist der Codeblock, um die Sortierung einer HashMap nach ihrem Schlüssel zu demonstrieren.

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class HashMapSortByKey {
  public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("2", "Value5");
    map.put("3", "Value1");
    map.put("1", "Value2");
    map.put("4", "Value3");
    map.put("9", "Value4");
    map.put("hi11", "Value6");
    map.put("hi0", "Value7");
    System.out.print("Unordered List: ");
    for (String s : map.keySet()) {
      System.out.print(" " + s);
    }
    System.out.println();
    System.out.print("Ordered List: ");
    TreeMap<String, String> map1 = new TreeMap<>(map);
    for (String s : map1.keySet()) {
      System.out.print(" " + s);
    }
  }
}

Im obigen Codeblock wird das Objekt map mit dem Standardkonstruktor HashMap mit dem Schlüsselwort new deklariert. Die Anweisung erzeugt eine Instanz der Klasse HashSet und weist den Wert der Schnittstellenreferenz Map zu. Die Typen sind kompatibel, da die Klasse HashMap die Schnittstelle Map intern implementiert.

Die Karte wird mit einigen Schlüsselwerten initialisiert. Das Einfügen erfolgt mit der Methode put, die den Schlüssel an seinen angegebenen Wert bindet. Die Methode gibt den previous value zurück, wenn der Schlüssel bereits in der Karte vorhanden war und überschreibt den vorherigen Wert mit einem angegebenen. Die Funktion gibt einen null-Wert zurück, wenn der Schlüssel noch nicht in der Karte vorhanden ist. Es wirft IllegalArgumentException, wenn die Eigenschaft des Schlüssels oder Werts das Einfügen des Werts verbietet.

Um nun über die Karte zu iterieren, wird die for-each-Schleife verwendet. Die Funktion map.keySet gibt das Set-Format aller Schlüssel in der Karte zurück. Die keyset-Funktion ruft in der for-each-Schleife eine Sammlung ab, über die die Variable iterieren kann; daher Drucken der Schlüssel. Die Werte werden in einem ungeordneten Format ausgegeben, und es gibt keine genau definierte Art und Weise, wie der Benutzer die Ausgabe erhält.

Um die Kartenschlüssel zu sortieren, wird die Klasse TreeSet verwendet. Die Variable map wird zum Zeitpunkt der Instanziierung als Konstruktorparameter im Konstruktor TreeSet übergeben. Die Klasse implementiert das Interface Comparable, um die Schlüssel zu sortieren. Wenn die resultierende Karte map1 gedruckt wird, gibt sie die sortierten Schlüssel in der Ausgabe aus.

Unten ist die Ausgabe des obigen Codeblocks.

Ausgabe:

Unordered List:  1 hi11 2 3 4 9 hi0
Ordered List:  1 2 3 4 9 hi0 hi11

Sortieren des Keysets mit den Java 8-Funktionen

Java 8 bietet das Privileg der funktionalen Programmierung, die beim Überarbeiten der Kettenfunktionen hilft. Im folgenden Programm sieht man, dass Instanziierung und Initialisierung in einer Anweisung erfolgen. Während es im ersten Beispielcode eine mühsame Aufgabe ist, die Karte zu füllen. Im Folgenden wird das Verständnis der Streams und Funktionen zum Instanziieren der Karte in einer einzigen Anweisung gegeben.

Streams ist eine Schnittstelle im java.util-Paket, die Flexibilität bietet, um die Abfolge von Operationen in einem Durchgang zu bearbeiten. Der Streams arbeitet in der Pipeline, wo ein Emitter die Daten ausgibt; es wird gefiltert, verarbeitet, transformiert und vieles mehr nach den Bedürfnissen der Benutzer.

import static java.util.AbstractMap.SimpleEntry;
import static java.util.stream.Collectors.toMap;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Stream;

public class HashMapSortByKey {
  public static void main(String[] args) {
    Map<String, String> map =
        Stream
            .of(new SimpleEntry<>("key6", "value1"), new SimpleEntry<>("key12", "value2"),
                new SimpleEntry<>("key9", "value3"))
            .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue));

    System.out.print("Unordered List: ");
    for (String s : map.keySet()) {
      System.out.print(" " + s);
    }
    Map<String, String> mapSortedByKey =
        map.entrySet()
            .stream()
            .sorted(Map.Entry.<String, String>comparingByKey().reversed())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                (oldVal, newValue) -> oldValue, LinkedHashMap::new));

    System.out.println();
    System.out.print("Ordered List: ");
    for (String s1 : mapSortedByKey.keySet()) {
      System.out.print(" " + s1);
    }
  }
}

Verstehen Sie die Stream-Funktion zur Karteninitialisierung in Java in

Zunächst ruft der Stream die Funktion of() auf, die den angegebenen Stream in sequentieller Reihenfolge zurückgibt. Die Funktion erstellt Objekte der Klasse SimpleEntry, um Mappings der Schlüssel-Wert-Form zu erstellen. Die Klasse implementiert das Interface Entry und hat die Methode entrySet, die die Sammlungsansicht der Karte zurückgibt.

Sobald die Key-Value-Einträge gebildet sind, werden die Werte mit der Funktion collect auf einer Karte gesammelt. Es handelt sich um eine Terminalfunktion, was bedeutet, dass nach der Collect-Funktion keine Methoden mehr aufgerufen werden können. Die Funktion verpackt oder bindet die Streamwerte in die gewünschten Datenstrukturen.

Die als Parameter angegebene Eingabe ist immer eine Collector-Referenz. Die toMap ist eine statische Funktion in der Klasse Collectors, die einen Collector zurückliefert, der die Stream-Elemente in einer Map bindet. Die Funktion verwendet einen Key Mapper und den Key Value Function als Parameter. Nun bedeutet die Methodenreferenz :: den Aufruf der Funktionen der angegebenen Klasse.

Im Key Mapper extrahiert die Funktion getKey den Schlüssel aus dem gefüllten EntrySet-Stream. In ähnlicher Weise wird in der Key Value-Funktion die Funktion getValue aufgerufen, um den Wert aus dem Stream EntrySet zu erhalten.

Die Variablen Collector Function aus dem obigen Code sind die funktionalen Schnittstellen in Java, die eine einzige abstrakte Methode für die Funktionalität haben. Die Definitionen der abstrakten Methode werden in Klassen definiert, die sie implementieren.

Verstehen Sie die Map Transformation Stream-Funktion in Java

Über die soeben entstandene Instanz map wird die Funktion entrySet aufgerufen. Die Funktion gibt die eingestellte Ansicht der Karteneinträge zurück und ist in der Kartenoberfläche vorhanden. Über diesen Einträgen wird die Methode stream aufgerufen, um die Einträge in den sequentiellen Stream zu konvertieren. Über den Strom der Einträge wird die Funktion sortiert aufgerufen.

Es braucht einen Comparator, um die Stream-Elemente zu vergleichen. Die sortierte Funktion gibt schließlich den sortierten Strom der angegebenen Einträge zurück. Die Funktion comparingByKey gibt den Komparator Map.Entry mit der Standardreihenfolge auf dem Schlüssel zurück. Der Komparator gibt einen Schlüsselsatz zurück; wenn ein gefundener Schlüssel null ist, wirft er NullPointerException von der Funktion.

Wenn der Eintragssatz abgerufen wird, wird die Funktion reversed aufgerufen, um die Reihenfolge der Elemente in der Sammlung umzukehren. Schließlich wird die Funktion collect über den Kartenstream aufgerufen. Die Funktion ist ein Terminaloperator, daher können nach der Funktion collect keine Operationen aufgerufen werden. In der Funktion wird die Funktion toMap aufgerufen, um den Stream in die Karte umzuwandeln.

Die Funktion benötigt vier Parameter: Der keyMapper ist eine Funktion, die Schlüssel erzeugt, der valueMapper ist eine Mapping-Funktion, die ihre Werte erzeugt, die mergeFunction ist ein BinaryOperator, der eine Funktion zusammenführt, und der mapSupplier ist eine Lieferanten-Funktion, die eine neue, leere Karte zurückgibt, in die die Ergebnisse eingefügt werden. Schließlich wird die resultierende Konsolenausgabe oben ausgegeben.

Ausgabe:

Unordered List:  key12 key6 key9
Ordered List:  key9 key6 key12
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

Verwandter Artikel - Java HashMap