Ordenar un HashMap por clave en Java

Rashmi Patidar 12 octubre 2023
  1. Ordene el conjunto de claves usando la clase TreeMap en Java
  2. Ordenar el conjunto de teclas con las funciones de Java 8
  3. Comprender la función de secuencia de inicialización de mapas en Java
  4. Comprender la función de flujo de transformación de mapas en Java
Ordenar un HashMap por clave 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 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

Artículo relacionado - Java HashMap