Ordina una HashMap per chiave in Java

Rashmi Patidar 12 ottobre 2023
  1. Ordina il set di chiavi utilizzando la classe TreeMap in Java
  2. Ordinamento del keyset utilizzando le funzioni Java 8
  3. Comprendere la funzione del flusso di inizializzazione della mappa in Java
  4. Comprendere la funzione del flusso di trasformazione della mappa in Java
Ordina una HashMap per chiave in Java

Il termine HashMap in linguaggio Java è la raccolta derivata dall’interfaccia Map. Questa raccolta o classe è presente nel pacchetto java.util e memorizza i dati in coppia chiave-valore. Nota che non possono esserci due chiavi sulla mappa. Se viene inserita la chiave duplicata, il valore della rispettiva chiave viene sostituito dal valore più recente.

Ordina il set di chiavi utilizzando la classe TreeMap in Java

Di seguito è riportato il blocco di codice per dimostrare l’ordinamento di una HashMap in base alla sua chiave.

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);
    }
  }
}

Nel blocco di codice sopra, l’oggetto map è dichiarato utilizzando il costruttore predefinito di HashMap con la parola chiave new. L’istruzione crea un’istanza della classe HashSet e assegna il valore al riferimento dell’interfaccia Map. I tipi sono compatibili poiché la classe HashMap implementa internamente l’interfaccia Map.

La mappa viene inizializzata con una serie di valori chiave. L’inserimento avviene utilizzando il metodo put che lega la chiave al suo valore specificato. Il metodo restituisce il previous value se la chiave era già presente nella mappa e sovrascrive il valore precedente con uno specificato. La funzione restituisce un valore null quando la chiave non è già presente nella mappa. Genera IllegalArgumentException se la proprietà della chiave o del valore impedisce l’inserimento del valore.

Ora per l’iterazione sulla mappa, viene utilizzato il bucle for-each. La funzione map.keySet restituisce il formato Set di tutte le chiavi della mappa. La funzione keyset ottiene una raccolta nel bucle for-each su cui la variabile può iterare; quindi, stampando le chiavi. Stamperà i valori in un formato non ordinato e non esiste un modo ben definito in cui l’utente otterrà l’output.

Per ordinare le chiavi della mappa, viene utilizzata la classe TreeSet. La variabile map è data come parametro del costruttore nel costruttore TreeSet al momento dell’istanza. La classe implementa l’interfaccia Comparable per ordinare le chiavi. Quando la mappa risultante, map1, viene stampata, stampa le chiavi ordinate nell’output.

Di seguito è riportato l’output del blocco di codice sopra.

Produzione:

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

Ordinamento del keyset utilizzando le funzioni Java 8

Java 8 fornisce un privilegio di programmazione funzionale, che aiuta a lavorare sulle funzioni della catena. Nel programma seguente, si vede che l’istanziazione e l’inizializzazione avvengono in un’istruzione. Considerando che nel primo codice di esempio, è un compito noioso popolare la mappa. Di seguito viene fornita la comprensione degli Stream e delle funzioni per istanziare la mappa in un’unica istruzione.

Streams è un’interfaccia nel pacchetto java.util che fornisce flessibilità per lavorare sulla sequenza di operazioni in un unico passaggio. Il Streams funziona nella pipeline in cui un emettitore emette i dati; viene filtrato, elaborato, trasformato e molto altro in base alle esigenze degli utenti.

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);
    }
  }
}

Comprendere la funzione del flusso di inizializzazione della mappa in Java

Innanzitutto, il Stream chiama la funzione of() che restituisce il flusso specificato in ordine sequenziale. La funzione crea oggetti della classe SimpleEntry per creare mappature del modulo chiave-valore. La classe implementa l’interfaccia Entry e dispone del metodo entrySet che restituisce la visualizzazione della raccolta della mappa.

Una volta formate le voci chiave-valore, i valori vengono raccolti in una mappa utilizzando la funzione collect. È una funzione terminale, il che significa che nessun altro metodo può essere invocato dopo la funzione collect. La funzione impacchetta o associa i valori del flusso nelle strutture dati desiderate.

L’input dato come parametro è sempre un riferimento Collector. Il toMap è una funzione statica nella classe Collectors che restituisce un Collector che lega gli elementi del flusso in una mappa. La funzione prende come parametro un mappatore di tasti e il valore del tasto Function. Ora, l’operatore di riferimento al metodo :: significa chiamare le funzioni della classe specificata.

Nel key Mapper, la funzione getKey estrae la chiave dal flusso EntrySet popolato. Allo stesso modo, nella funzione chiave Value, la funzione getValue viene chiamata per ottenere il valore dal flusso EntrySet.

Le variabili Collector Function del codice sopra sono le interfacce funzionali in Java che hanno un unico metodo astratto per la funzionalità. Le definizioni del metodo astratto vengono definite nelle classi che le implementano.

Comprendere la funzione del flusso di trasformazione della mappa in Java

Sull’istanza map appena formata viene invocata la funzione entrySet. La funzione restituisce la vista impostata delle voci della mappa ed è presente nell’interfaccia Mappa. Su queste voci viene chiamato il metodo stream per convertire le voci nel flusso sequenziale. Nel flusso di voci, viene invocata la funzione ordinata.

Ci vuole un Comparator per confrontare gli elementi Stream. La funzione ordinata restituisce infine il flusso ordinato delle voci fornite. La funzione comparingByKey restituisce il comparatore Map.Entry con l’ordinamento predefinito sulla chiave. Il comparatore restituisce un set di chiavi; se una chiave trovata è nulla, genera NullPointerException dalla funzione.

Quando viene recuperato il set di voci, viene chiamata la funzione reversed per invertire l’ordine degli elementi nella raccolta. Infine, la funzione collect viene invocata sullo stream della mappa. La funzione è un operatore terminale e quindi nessuna operazione può essere chiamata dopo la funzione collect. Nella funzione viene chiamata la funzione toMap per trasformare lo stream in mappa.

La funzione accetta quattro parametri: keyMapper è una funzione che produce chiavi, valueMapper è una funzione di mappatura che crea i suoi valori, mergeFunction è un BinaryOperator che unisce una funzione e mapSupplier è una funzione Supplier che restituisce una nuova Mappa vuota in cui vengono inseriti i risultati. Infine, l’output della console risultante viene stampato sopra.

Produzione:

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

Articolo correlato - Java HashMap