为了账号安全,请及时绑定邮箱和手机立即绑定

按键排序地图 - 解释

按键排序地图 - 解释

炎炎设计 2019-04-17 14:15:10
我想对包含以下格式的数据的文本文件进行排序:A 8B 2C 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排序图,但我不明白。
查看完整描述

2 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

所述(oldValue, newValue) -> oldValue, LinkedHashMap::new)lambda表达式是合并函数,它在具有相同键的两个值应用。在这种情况下,它返回第一个值并丢弃第二个值。

也就是说,您的代码效率低下,因为您正在创建两个Map并运行两个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));}


查看完整回答
反对 回复 2019-05-15
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞


第三个参数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))

如果存在重复键,请选择上一个键或新键


查看完整回答
反对 回复 2019-05-15
  • 2 回答
  • 0 关注
  • 526 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信