Как отсортировать внешнюю карту по значению вложенной карты - PullRequest
0 голосов
/ 02 июля 2019

У меня проблема с сортированным методом Java 8.

Я получил следующую структуру:

Map<String, Map<String, Long>>

Я пытаюсь отсортировать внешнюю карту сначала по ключу внешней карты (принудительный порядок), затем по сумме значений внутренней карты (Longs).) и поместите его в список Map.Entry в правильном порядке.Мне удалось отсортировать его по первому условию, но я не могу заставить его работать со вторым условием (затем метод сравнения) - есть ошибка типа.

queryResult.allCountersArray = queryResult.allCounters.entrySet().stream()
        .sorted(Map.Entry.<String, Map<String, Long>>comparingByKey(Comparator.comparing(term -> term.getSortingKey()))
                .thenComparing(Map.Entry.<String, Map<String, Long>>comparingByValue(Map.Entry.<String, Long>comparingByValue()))
        )
        .collect(Collectors.toList());


Error:(87, 49) java: no suitable method found for comparingByValue(java.util.Comparator<java.util.Map.Entry<java.lang.String,java.lang.Long>>)
    method java.util.Map.Entry.<K,V>comparingByValue() is not applicable
      (explicit type argument java.util.Map<java.lang.String,java.lang.Long> does not conform to declared bound(s) java.lang.Comparable<? super java.util.Map<java.lang.String,java.lang.Long>>)
    method java.util.Map.Entry.<K,V>comparingByValue(java.util.Comparator<? super V>) is not applicable
      (argument mismatch; java.util.Comparator<java.util.Map.Entry<java.lang.String,java.lang.Long>> cannot be converted to java.util.Comparator<? super java.util.Map<java.lang.String,java.lang.Long>>)

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вы не можете использовать comparingByValue в этом случае, потому что вы не хотите сортировать по отдельным записям внутренней карты.

Лучшее, что вы можете сделать:

List<Entry<String, Map<String, Long>>> result = queryResult.entrySet()
        .stream()
        .sorted(Comparator.comparing(Entry<String, Map<String, Long>>::getKey)
                .thenComparingLong(e -> e.getValue()
                        .values()
                        .stream()
                        .mapToLong(i -> i)
                        .sum()))
        .collect(Collectors.toList());

Или

List<Entry<String, Map<String, Long>>> result2 = queryResult.entrySet()
        .stream()
        .sorted(Entry.<String, Map<String, Long>>comparingByKey()
                .thenComparingLong(e -> e.getValue()
                        .values()
                        .stream()
                        .mapToLong(i -> i)
                        .sum()))
        .collect(Collectors.toList());
0 голосов
/ 02 июля 2019

Это должно работать:

final Map<String, Map<String, Long>> map = new HashMap<>();

final List<Entry<String, Map<String, Long>>> sorted = 
    map.entrySet().stream().sorted((a,  b) -> Long.compare(
        a.getValue().values().stream().mapToLong(l -> l).sum(),
        b.getValue().values().stream().mapToLong(l -> l).sum()))
    .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...