Cómo ordenar un mapa por valor en Java
-
Ordenar un
Map
Usando elsort()
método en Java -
Ordenar un
Map
Usando el método desorted()
en Java -
Ordenar un
Map
Usandosort()
Método conComparator
en Java -
Ordenar un
Map
Usandosorted()
ytoMap()
Método en Java -
Ordena un
Map<key, value>
usando código personalizado 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