Упорядочивание HashMap по размеру установленного значения - PullRequest
0 голосов
/ 05 ноября 2018

Я бы хотел заказать HashMap:

Map<Integer, Set<Integer>> unsorted

размером установленного значения. Я попытался сделать это следующим образом:

        Map<Integer, Set<Integer>> sorted = unsorted.entrySet().stream()
            .sorted(comparingInt(e->e.getValue().size()))
            .collect(toMap(
                    Map.Entry::getKey,
                    Map.Entry::getValue,
                    LinkedHashMap::new
            ));

но получил ошибку

«На нестатический метод нельзя ссылаться из статического контекста»

. Я новичок в Java 8 Streams, и мне явно не хватает чего-то тривиального - что это?

1 Ответ

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

Краткий ответ: Вам не хватает функции слияния:

.collect(toMap(Map.Entry::getKey,Map.Entry::getValue, (l, r) -> l, LinkedHashMap::new));

т.е. (l, r) -> l выше.

Длинный ответ:

Вы хотите использовать перегрузку toMap, которая использует "mapFactory" в качестве документа, вызывающего документ, по сути это поставщик, предоставляющий новую пустую карту, в которую будут вставлены результаты.

Теперь посмотрим, как определяется перегрузка:

toMap​(Function<? super T,? extends K> keyMapper,
      Function<? super T,? extends U> valueMapper,
      BinaryOperator<U> mergeFunction,
      Supplier<M> mapFactory)

Как вы можете видеть, mergeFunction необходим для предоставления "mapFactory", иначе компилятор подумает, что вы пытаетесь использовать эту перегрузку:

toMap​(Function<? super T,? extends K> keyMapper,
      Function<? super T,? extends U> valueMapper,
      BinaryOperator<U> mergeFunction)

следовательно, это терпит неудачу с вышеупомянутой ошибкой.

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