Сортировать по нескольким свойствам в списке целых - PullRequest
2 голосов
/ 05 июня 2019

У меня есть список целых чисел, и я хотел бы распечатать все их элементы отсортированным способом, используя 2 свойства: размер списка и сумму элементов в списке.Я читаю метод thenComparing streams *, но при попытке его использовать появляется ошибка.

Я написал некоторый код, который работает, но хотел бы знать, есть ли какой-нибудь другой более чистый способ сделать это.Заранее спасибо!

Map<List<Integer>, Double> entropies = new HashMap<>();

// Extra code removed

entropies.keySet()
    .stream().sorted(Comparator.comparingInt(o -> {
        List<Integer> a = (List<Integer>) o;
        return a.size();
    }).thenComparingInt(o -> {
        List<Integer> a = (List<Integer>) o;
        return a.stream().mapToInt(Integer::intValue).sum();
    }))
    .forEach(key -> logger.debug("{} => {}", key, entropies.get(key)));

То же, что и фактический результат, но без отливок было бы здорово.

1 Ответ

3 голосов
/ 05 июня 2019

Должно работать следующее:

entropies.keySet()
         .stream().sorted(Comparator.<List<Integer>>comparingInt(List::size)
                              .thenComparingInt(o -> o.stream().mapToInt(Integer::intValue).sum()))
         .forEach(key -> logger.debug("{} => {}", key, entropies.get(key)));

Так как Comparator.comparingInt не может вывести тип как List>.Подсказка типа при вызове позволяет компилятору узнать фактический тип.Это связано с тем, что метод sorted ожидает Comparator<? super List<Integer>> comparator, поэтому технически ваш компаратор может иметь любой суперкласс List, поэтому вам нужно явно указать, какой это суперкласс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...