Ordenar un HashMap por clave en Java
-
Ordene el conjunto de claves usando la clase
TreeMap
en Java - Ordenar el conjunto de teclas con las funciones de Java 8
- Comprender la función de secuencia de inicialización de mapas en Java
- Comprender la función de flujo de transformación de mapas en Java
El término HashMap
en lenguaje Java es la colección derivada de la interfaz Map
. Esta colección o clase está presente en el paquete java.util
y almacena los datos en un par clave-valor. Tenga en cuenta que no puede haber dos claves en el mapa. Si se inserta la clave duplicada, el valor de la clave respectiva se reemplaza por el valor más nuevo.
Ordene el conjunto de claves usando la clase TreeMap
en Java
A continuación se muestra el bloque de código para demostrar la clasificación de un HashMap
por su clave.
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);
}
}
}
En el bloque de código anterior, el objeto map
se declara utilizando el constructor predeterminado de HashMap
con la palabra clave new
. La declaración crea una instancia de la clase HashSet
y asigna el valor a la referencia de la interfaz Map
. Los tipos son compatibles ya que la clase HashMap
implementa la interfaz Map
internamente.
El mapa se inicializa con algún conjunto de valores clave. La inserción ocurre usando el método put
que vincula la clave a su valor especificado. El método devuelve el previous value
si la clave ya estaba presente en el mapa y anula el valor anterior con uno especificado. La función devuelve un valor null
cuando la clave aún no está presente en el mapa. Lanza IllegalArgumentException
si la propiedad de la clave o el valor prohíbe la inserción del valor.
Ahora, para iterar sobre el mapa, se utiliza el bucle for-each
. La función map.keySet
devuelve el formato Set
de todas las teclas del mapa. La función de conjunto de claves obtiene una colección en el bucle for-each
sobre el que la variable puede iterar; por lo tanto, imprimir las claves. Imprimirá los valores en un formato desordenado y no hay una forma bien definida en la que el usuario obtenga la salida.
Para ordenar las claves del mapa, se utiliza la clase TreeSet
. La variable map
se proporciona como un parámetro de constructor en el constructor TreeSet
en el momento de la instanciación. La clase implementa la interfaz Comparable
para ordenar las claves. Cuando se imprime el mapa resultante, map1
, imprime las claves ordenadas en la salida.
A continuación se muestra la salida del bloque de código anterior.
Producción :
Unordered List: 1 hi11 2 3 4 9 hi0
Ordered List: 1 2 3 4 9 hi0 hi11
Ordenar el conjunto de teclas con las funciones de Java 8
Java 8 proporciona un privilegio de programación funcional, que ayuda a trabajar sobre las funciones de la cadena. En el programa siguiente, se ve que la creación de instancias y la inicialización ocurren en una declaración. Mientras que en el primer código de ejemplo, completar el mapa es una tarea tediosa. La comprensión de las Streams
y las funciones para crear una instancia del mapa en una sola declaración se muestra a continuación.
Streams
es una interfaz en el paquete java.util
que proporciona flexibilidad para trabajar sobre la secuencia de operaciones de una sola vez. El Streams
funciona en la tubería donde un emisor emite los datos; se filtra, procesa, transforma y mucho más según las necesidades de los usuarios.
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);
}
}
}
Comprender la función de secuencia de inicialización de mapas en Java
En primer lugar, el Stream
llama a la función of()
que devuelve el flujo especificado en orden secuencial. La función crea objetos de la clase SimpleEntry
para crear asignaciones de la forma clave-valor. La clase implementa la interfaz Entry
y tiene el método entrySet
que devuelve la vista de colección del mapa.
Una vez que se forman las entradas de valor-clave, los valores se recopilan en un mapa utilizando la función collect
. Es una función de terminal, lo que significa que no se pueden invocar más métodos después de la función de recopilación. La función empaqueta o vincula los valores de la secuencia en las estructuras de datos deseadas.
La entrada dada como parámetro es siempre una referencia de Collector
. El toMap
es una función estática en la clase Collectors
que devuelve un Collector
que une los elementos del flujo en un mapa. La función toma como parámetro un Mapeador de teclas y un Valor de tecla Function
. Ahora, el operador de referencia de método ::
significa llamar a las funciones de la clase especificada.
En el Mapeador de claves, la función getKey
extrae la clave del flujo de EntrySet
poblado. De manera similar, en la función de clave Value, se llama a la función getValue
para obtener el valor del flujo EntrySet
.
Las variables de Función
Collector
del código anterior son las interfaces funcionales en Java que tienen un único método abstracto para la funcionalidad. Las definiciones del método abstracto se definen en clases que las implementan.
Comprender la función de flujo de transformación de mapas en Java
Sobre la instancia de map
que se acaba de formar, se invoca la función entrySet
. La función devuelve la vista establecida de las entradas del mapa y está presente en la interfaz del mapa. Sobre estas entradas, se llama al método stream
para convertir las entradas en el flujo secuencial. Sobre el flujo de entradas, se invoca la función sorted
.
Se necesita un Comparator
para comparar los elementos de Stream
. La función ordenada finalmente devuelve el flujo ordenado de las entradas dadas. La función comparingByKey
devuelve el comparador Map.Entry
con el orden predeterminado en la clave. El comparador devuelve un conjunto de claves; si una clave encontrada es nula, arroja NullPointerException
desde la función.
Cuando se recupera el conjunto de entradas, se llama a la función reversed
para invertir el orden de los elementos en la colección. Finalmente, la función collect
se invoca sobre el flujo del mapa. La función es un operador de terminal y, por lo tanto, no se puede llamar a ninguna operación después de la función collect
. En la función, se llama a la función toMap
para transformar la secuencia en el mapa.
La función toma cuatro parámetros: el keyMapper
es una función que produce claves, el valueMapper
es una función de mapeo que crea sus valores, el mergeFunction
es un BinaryOperator
que fusiona una función, y el mapSupplier
es una función Supplier
que devuelve un mapa nuevo y vacío donde se insertan los resultados. Finalmente, la salida de la consola resultante se imprime arriba.
Producción :
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