Сортировка карты по нескольким значениям (Java8 / Jooq) - PullRequest
0 голосов
/ 09 ноября 2018

У нас была структура данных, которая выглядела примерно так:

Map<String, Double> responseMap;

И сортировали эту карту в порядке убывания на основе значения как:

responseMap.entrySet().stream()
        .sorted((Map.Entry.<String, Double>comparingByValue().reversed()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
                                      (e1, e2) -> e1, LinkedHashMap::new));

Теперь структура данных этой карты изменилась на что-то вроде:

Map<String, Tuple2<Double, Integer> responseMap;  //org.jooq.lambda.tuple.Tuple2

Как мы можем аккуратно отсортировать эту карту по новому значению (на основе значения Double и Integer)?

1 Ответ

0 голосов
/ 09 ноября 2018

Вы должны просто изменить компаратор:

responseMap.entrySet().stream()
    .sorted(Comparator.comparing((Map.Entry<String, Tuple2<Double, Integer> e) -> 
                                  e.getValue().v1())
                      .thenComparing(e -> e.getValue().v2())
                      .reversed())
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
                                  (e1, e2) -> e1, LinkedHashMap::new));

РЕДАКТИРОВАТЬ (согласно комментариям):

В качестве альтернативы, вы также можете использовать:

responseMap.entrySet().stream()
    .sorted(Comparator.comparing(Collections.reverseOrder(Map.Entry.comparingByValue(
            Comparator.comparing(Tuple2::v1).thenComparing(Tuple2::v2)))))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
                                  (e1, e2) -> e1, LinkedHashMap::new));
...