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

如何在java 8 Stream中定义自定义排序比较器来比较键和值

如何在java 8 Stream中定义自定义排序比较器来比较键和值

临摹微笑 2024-01-05 16:23:58
我想使用 Java 8 流对映射进行排序并返回其键的列表。地图签名是:Map<Integer, Integer> ranks = new HashMap<Integer, Integer>();数据将类似于 [ 1=6, 5=13, 2=11 ]我必须在两个条件下排序并返回键列表。如果键的所有值都不同,则按降序排序并返回基于值的列表,例如input [1=6 , 5=13 , 2= 11 , 4 = 14 ]result [4,5,2,1]如果键的两个或多个值具有相同的排名,则按升序返回这些相似的值,而项目的其余部分则按其值的降序排列,例如input [2=6 , 5=13 , 1= 11 , 3=13 ,9 = 22 ] result [9,3,5,1,2]下面的代码片段适用于条件 1,但不适用于条件 2。List<Integer> ranksList = ranks.entrySet().stream()    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))    .map(Map.Entry::getKey)    .limit(k)    .collect(Collectors.toList());
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

Comparator您正在寻找这样的定制:

.sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue()) == 0 ?
        o1.getKey().compareTo(o2.getKey()) : o2.getValue().compareTo(o1.getValue()))

理论上,

  • 首先按降序比较值,o2.getValue().compareTo(o1.getValue())然后

  • 如果它们相等,则按升序比较键o1.getKey().compareTo(o2.getKey())


查看完整回答
反对 回复 2024-01-05
?
守着一只汪

TA贡献1872条经验 获得超3个赞

Comparator声明链接的使用thenComparing。


Comparator<Map.Entry<Integer, Integer>> entryComparator

            = Map.Entry.<Integer, Integer>comparingByValue(Comparator.reverseOrder())

                                         .thenComparing(Map.Entry.comparingByKey());


Map<Integer,Integer> ranks = Map.of(2, 6, 5, 13, 1, 11, 3, 13, 9, 22);


List<Integer> ranksList= ranks.entrySet().stream()

            .sorted(entryComparator)

            .map(Map.Entry::getKey).limit(47)

            .collect(Collectors.toList());


System.out.println(ranksList);

输出是所需的:


[9, 3, 5, 1, 2]


Java 需要 的类型规范<Integer, Integer>来comparingByValue推断 的类型Map.Entry.comparingByKey()。


查看完整回答
反对 回复 2024-01-05
  • 2 回答
  • 0 关注
  • 214 浏览

添加回答

举报

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