【问题标题】:Java sort map by value with Stream [duplicate]Java使用Stream按值排序映射[重复]
【发布时间】:2021-03-01 21:32:09
【问题描述】:

我见过大多数使用 Stream 按值对地图进行排序的示例,但其中大多数使用的版本比我的稍微简单一些,因此不适用于我的情况。

this 网站提供与我的案例类似的示例,但由于 @ 导致“int cannot be dereferenced”错误,因此效果不佳987654322@ 函数,因为它不是用于比较基元。

我也尝试过使用Comparator.comparing(),但它对排序完全没有影响。

我有类似下面的东西;

Map<String, Person> sortedMap = sortPersonByValue(personMap);

public static Map<String, Person> sortPersonByValue(final Map<String, Person> regions) {

        return regions.entrySet()
                .stream()
                .sorted(((e1, e2) -> e1.getValue().getAge().compareTo(e2.getValue().getAge()))
                //.sorted(Comparator.comparing(e1 -> e1.getValue().getAge()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
}

如果有人能指出我做错了什么,我将不胜感激。谢谢

【问题讨论】:

  • 您的代码似乎有效,至少对我而言。什么不适合你?您能否添加一个示例输入和您的预期输出以及您的 Person 类?
  • @Eritrean 我想知道您是否尝试过注释掉 Comparator 版本并取消注释 getValue() 版本?
  • 请看我的回答
  • @Eritrean 对我有用。非常感谢您的帮助。
  • 只是在比较中交换e1和e2的顺序:.sorted((e1,e2) -&gt; Integer.compare(e2.getValue().getAge(), e1.getValue().getAge()))

标签: java sorting java-stream comparator


【解决方案1】:

假设 Age 是一个 int 类型并且你想使用Integer.compare(x,y) 版本:

return regions.entrySet()
            .stream()
            .sorted((e1,e2) -> Integer.compare(e1.getValue().getAge(), e2.getValue().getAge()))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

【讨论】:

  • 这段代码与问题中的代码有何不同之处在于后者不应该使用什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2019-04-29
  • 1970-01-01
  • 2011-11-19
  • 2013-02-01
  • 2019-01-31
相关资源
最近更新 更多