сортировать карту по ключу - объяснение - PullRequest
1 голос
/ 13 мая 2019

Я хотел отсортировать текстовый файл, содержащий данные в следующем формате:

A 8
B 2
C 5

по стоимости. Итак, я нашел это:

Map<String, Long> getSortedLinkedHashMappedRankingArray(String[] rankingArray) {
    return Arrays
            .stream(rankingArray)
            .map(it -> it.split("\\s+"))
            .collect(Collectors.toMap(it -> it[FIRST_PART], it -> Long.valueOf(it[SECOND_PART])))
            .entrySet()
            .stream()
            .sorted(Map.Entry.comparingByValue())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (oldValue, newValue) -> oldValue, LinkedHashMap::new));
}

Я понимаю почти все, кроме последней операции сбора:

.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (oldValue, newValue) -> oldValue, LinkedHashMap::new))

Не могли бы вы объяснить, что здесь происходит? Что такое oldValue и newValue и как это работает?

Также хотелось бы услышать, правильно ли я понимаю часть перед операцией collect.

  1. Итак, сначала мы создаем поток для данного массива.
  2. Затем мы разделяем каждый элемент массива с пустым пространством, чтобы мы можно указать имя в качестве ключа и число в качестве значения на карте.
  3. Затем мы создаем множество элементов карты и создаем поток.
  4. Затем мы сортируем по значению.

правый

PS: я читал Java Сортировать карту по объяснению ключа , но я не понял этого.

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Лямбда-выражение (oldValue, newValue) -> oldValue, LinkedHashMap::new) - это функция слияния, которая применяется к двум значениям, имеющим один и тот же ключ.В этом случае он возвращает первое значение и отбрасывает второе значение.

При этом ваш код неэффективен, поскольку вы создаете два Map s и запускаете два Stream конвейера.Вы можете добиться того же с одним:

Map<String, Long> getSortedLinkedHashMappedRankingArray(String[] rankingArray) {
    return Arrays
            .stream(rankingArray)
            .map(it -> it.split("\\s+"))
            .map(arr -> new SimpleEntry<> (arr[FIRST_PART], Long.valueOf(arr[SECOND_PART])))
            .sorted(Map.Entry.comparingByValue())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (oldValue, newValue) -> oldValue, LinkedHashMap::new));
}
1 голос
/ 13 мая 2019

третий параметр java doc

     *    a merge function, used to resolve collisions between
     *                      values associated with the same key, as supplied
     *                      to {@link Map#merge(Object, Object, BiFunction)}
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (oldValue, newValue) -> oldValue, LinkedHashMap::new))

Если есть повторяющиеся ключи, выберите предыдущий или новый

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