Quiero ordenar un mapa utilizando Java 8 arroyos y devolver una lista de su clave.
Mapa firma es:
Map<Integer, Integer> ranks = new HashMap<Integer, Integer>();
y los datos serán como [1 = 6, 5 = 13, 2 = 11]
Hay dos condiciones en las que tengo que ordenar y devolver una lista de claves.
Si todos los valores de las claves son diferentes, a continuación, ordenar y devuelven valores basados en una lista en orden descendente, por ejemplo,
input [1=6 , 5=13 , 2= 11 , 4 = 14 ] result [4,5,2,1]
Si dos o más valores de la clave están teniendo mismo rango, a continuación, volver estos similar en un orden ascendente, y el resto del artículo está en orden descendente con respecto a sus valores, por ejemplo,
input [2=6 , 5=13 , 1= 11 , 3=13 ,9 = 22 ] result [9,3,5,1,2]
A continuación se muestra el fragmento de código que está trabajando muy bien para la condición 1, pero no para la condición 2.
List<Integer> ranksList = ranks.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.map(Map.Entry::getKey)
.limit(k)
.collect(Collectors.toList());
Que busca una costumbre Comparator
como este:
.sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue()) == 0 ?
o1.getKey().compareTo(o2.getKey()) : o2.getValue().compareTo(o1.getValue()))
En teoría,
comparar los valores primero en orden descendente
o2.getValue().compareTo(o1.getValue())
ysi son iguales comparar las teclas en el orden ascendente
o1.getKey().compareTo(o2.getKey())
.