按键排序地图 - 解释

我想对包含以下格式的数据的文本文件进行排序:


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操作前是否正确理解了部分内容。


首先,我们正在创建给定数组的流。

然后我们用空格分割数组的每个元素,这样我们就可以将name作为键和数字作为映射中的值。

然后我们创建地图元素集并创建流。

然后我们按价值排序。

对?

PS:我正在通过关键解释阅读Java排序图,但我不明白。



炎炎设计
浏览 527回答 2
2回答

潇潇雨雨

所述(oldValue, newValue) -> oldValue, LinkedHashMap::new)lambda表达式是合并函数,它在具有相同键的两个值应用。在这种情况下,它返回第一个值并丢弃第二个值。也就是说,您的代码效率低下,因为您正在创建两个Map并运行两个Stream管道。你可以用一个来实现同样的目标:Map<String,&nbsp;Long>&nbsp;getSortedLinkedHashMappedRankingArray(String[]&nbsp;rankingArray)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Arrays &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.stream(rankingArray) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(it&nbsp;->&nbsp;it.split("\\s+")) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(arr&nbsp;->&nbsp;new&nbsp;SimpleEntry<>&nbsp;(arr[FIRST_PART],&nbsp;Long.valueOf(arr[SECOND_PART]))) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sorted(Map.Entry.comparingByValue()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toMap(Map.Entry::getKey,&nbsp;Map.Entry::getValue, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(oldValue,&nbsp;newValue)&nbsp;->&nbsp;oldValue,&nbsp;LinkedHashMap::new));}

凤凰求蛊

第三个参数java doc&nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; a merge function, used to resolve collisions between&nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values associated with the same key, as supplied&nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; to {@link Map#merge(Object, Object, BiFunction)}.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (oldValue, newValue) -> oldValue, LinkedHashMap::new))如果存在重复键,请选择上一个键或新键
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java