Как отсортировать карту> Задать размер суммы? - PullRequest
4 голосов
/ 18 мая 2019

Как мне отсортировать карту (String, List (Set (Long))) по сумме заданного размера? У меня есть HashMap, как это:

myMap.put("monday", [[3215, 5654], [5345], [3246, 7686, 4565]]) // 6 Long elements in total
myMap.put("tuesday", [[3215, 5654], [5345, 2879, 6734], [3246, 7686, 4565]]) // 8 Long elements in total
myMap.put("wednesday", [[9845, 2521], [0954]]) // 3 Long elements in total

Я ожидаю, что myMap отсортирован так:

("tuesday", [[3215, 5654], [5345, 2879, 6734], [3246, 7686, 4565]]) // 8 Long elements in total
("monday", [[3215, 5654], [5345], [3246, 7686, 4565]]) // 6 Long elements in total
("wednesday", [[9845, 2521], [0954]]) // 3 Long elements in total

Ответы [ 2 ]

5 голосов
/ 18 мая 2019

Используйте LinkedHashMap для сортировки:

Map<String, List<Set<Long>>> result = map.entrySet()
    .stream()
    .sorted(Comparator.comparingInt(e->e.getValue().stream().mapToInt(Set::size).sum()))
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
1 голос
/ 18 мая 2019

Вы могли бы выполнить некоторые операции с ним, но сохранение отсортированного по значению HashMap действительно невозможно.

Однако, если вам известны операции, которые вы хотите выполнить над ним, вы можете использовать следующее решение.

myMap.entrySet()
     .stream()
     .sorted((entry1, entry2) -> {
         Integer sum1 = getSumOfSetCount(entry1.getValue());
         Integer sum2 = getSumOfSetCount(entry2.getValue());
         return Integer.compare(sum1, sum2);
     })
     .forEach(entry -> // perform operation);

С getSumOfSetCount(), являющимся

public int getSumOfSetCount(List<Set<Long>> list) {
    return (int) list.stream()
                     .flatMap(Stream::of)
                     .count();
}
...