Cómo definir comparador de encargo ordenada en Java 8 Corriente de comparar en la clave y el valor

Haris:

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.

  1. 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]
    
  2. 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());
también:

Que busca una costumbre Comparatorcomo 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())y

  • si son iguales comparar las teclas en el orden ascendente o1.getKey().compareTo(o2.getKey()).

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=323704&siteId=1
Recomendado
Clasificación