Ordina una HashMap per chiave in Java
-
Ordina il set di chiavi utilizzando la classe
TreeMap
in Java - Ordinamento del keyset utilizzando le funzioni Java 8
- Comprendere la funzione del flusso di inizializzazione della mappa in Java
- Comprendere la funzione del flusso di trasformazione della mappa 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 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