Cómo ordenar un mapa por valor en Java

Mohammad Irfan 12 octubre 2023
  1. Ordenar un Map Usando el sort() método en Java
  2. Ordenar un Map Usando el método de sorted() en Java
  3. Ordenar un Map Usando sort() Método con Comparator en Java
  4. Ordenar un Map Usando sorted() y toMap() Método en Java
  5. Ordena un Map<key, value> usando código personalizado en Java
Cómo ordenar un mapa por valor en Java

Este tutorial introduce cómo ordenar un Map<key, value> por valor en Java y lista algunos códigos de ejemplo para entenderlo.

Hay varias maneras de ordenar un Map<key, value>. Aquí usamos el método sort(), sorted() y la interfaz del comparador, etc. Veamos los ejemplos.

Ordenar un Map Usando el sort() método en Java

Podemos usar el método sort() de la interfaz List para ordenar los elementos de Map. El método sort() ordena los elementos en orden ascendente y especificamos el orden por valor usando el método comparingByValue(). Vea el ejemplo a continuación.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class SimpleTesting {
  public static void main(String[] args) {
    Map<Integer, Integer> map = new HashMap<>();
    map.put(2, 1020);
    map.put(3, 300);
    map.put(1, 100);
    map.put(5, 500);
    map.forEach((k, v) -> System.out.println(k + "=" + v));
    System.out.println("After Sorting by value");
    List<Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
    list.sort(Entry.comparingByValue());
    list.forEach(System.out::println);
  }
}

Resultado:

1=100
2=1020
3=300
5=500
After Sorting
1=100
3=300
5=500
2=1020

Ordenar un Map Usando el método de sorted() en Java

Si trabajas con corrientes, puedes usar el método sorted() que ordena los elementos en orden ascendente. Pasamos Map.Entry.comparingByValue() como argumento al método sorted() para ordenar el Map<key, value> por valores.

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

public class SimpleTesting {
  public static void main(String[] args) {
    Map<Integer, Integer> map = new HashMap<>();
    map.put(2, 1020);
    map.put(3, 300);
    map.put(1, 100);
    map.put(5, 500);
    map.forEach((k, v) -> System.out.println(k + "=" + v));
    System.out.println("After Sorting by value");
    Stream<Map.Entry<Integer, Integer>> sorted =
        map.entrySet().stream().sorted(Map.Entry.comparingByValue());
    sorted.forEach(System.out::println);
  }
}

Resultado:

1 = 100 2 = 1020 3 = 300 5 = 500 After Sorting by value 1 = 100 3 = 300 5 = 500 2 = 1020

Ordenar un Map Usando sort() Método con Comparator en Java

En este ejemplo, usamos el método compareTo() para comparar los valores de Map<key, value> dentro del método sort() como argumento. Puedes ver que creamos una clase interna anónima de la interfaz del Comparator y definimos el método compare() para comparar los valores.

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class SimpleTesting {
  public static void main(String[] args) {
    Map<Integer, Integer> map = new HashMap<>();
    map.put(2, 1020);
    map.put(3, 300);
    map.put(1, 100);
    map.put(5, 500);
    map.forEach((k, v) -> System.out.println(k + "=" + v));
    System.out.println("After Sorting by value");
    List<Entry<Integer, Integer>> list = new LinkedList<>(map.entrySet());
    Collections.sort(list, new Comparator<Object>() {
      @SuppressWarnings("unchecked")
      public int compare(Object o1, Object o2) {
        return ((Comparable<Integer>) ((Map.Entry<Integer, Integer>) (o1)).getValue())
            .compareTo(((Map.Entry<Integer, Integer>) (o2)).getValue());
      }
    });
    Map<Integer, Integer> result = new LinkedHashMap<>();
    for (Iterator<Entry<Integer, Integer>> it = list.iterator(); it.hasNext();) {
      Map.Entry<Integer, Integer> entry = (Map.Entry<Integer, Integer>) it.next();
      result.put(entry.getKey(), entry.getValue());
    }
    result.forEach((k, v) -> System.out.println(k + "=" + v));
  }
}

Resultado:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

Ordenar un Map Usando sorted() y toMap() Método en Java

En este ejemplo, estamos usando el método sorted() para ordenar el Map<key, value> y recoger el resultado en LinkedHashMap usando el método toMap(). Aquí, usamos el concepto de referencia del método para crear un objeto LinkedHashMap.

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String[] args) {
    Map<Integer, Integer> map = new HashMap<>();
    map.put(2, 1020);
    map.put(3, 300);
    map.put(1, 100);
    map.put(5, 500);
    map.forEach((k, v) -> System.out.println(k + "=" + v));
    System.out.println("After Sorting by value");
    Map<Integer, Integer> result = map.entrySet()
                                       .stream()
                                       .sorted(Entry.comparingByValue())
                                       .collect(Collectors.toMap(Entry::getKey, Entry::getValue,
                                           (e1, e2) -> e1, LinkedHashMap::new));
    result.forEach((k, v) -> System.out.println(k + "=" + v));
  }
}

Resultado:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

Ordena un Map<key, value> usando código personalizado en Java

Aquí, creamos una clase definida por el usuario que implementa la interfaz del Comparator y le pasamos su objeto al TreeMap para que se ordene Map por valor.

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
class UserComparator implements Comparator<Object> {
  Map<Integer, Integer> map;
  public UserComparator(Map<Integer, Integer> map) {
    this.map = map;
  }
  public int compare(Object o1, Object o2) {
    if (map.get(o2) == map.get(o1))
      return 1;
    else
      return ((Integer) map.get(o1)).compareTo((Integer) map.get(o2));
  }
}
public class SimpleTesting {
  public static void main(String[] args) {
    Map<Integer, Integer> map = new HashMap<>();
    map.put(2, 1020);
    map.put(3, 300);
    map.put(1, 100);
    map.put(5, 500);
    map.forEach((k, v) -> System.out.println(k + "=" + v));
    System.out.println("After Sorting by value");
    UserComparator comparator = new UserComparator(map);
    Map<Integer, Integer> result = new TreeMap<Integer, Integer>(comparator);
    result.putAll(map);
    result.forEach((k, v) -> System.out.println(k + "=" + v));
  }
}

Resultado:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

Artículo relacionado - Java Map