如何在Java流中按值对LinkedHashMap进行降序排序?

要按升序排序,我可以使用:

myMap.entrySet().stream()
    .sorted(Map.Entry.comparingByValue())
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

我怎样才能按降序进行?


答案 1

要按相反的顺序排序,请将参数作为参数传递给 。Comparator.reverseOrder()comparingByValue

要获得 一个,您必须专门请求一个带有 4 参数的 。如果未指定所需的地图类型,则将获得默认值,当前恰好是 .由于不保留元素的顺序,因此它绝对不会为您服务。LinkedHashMaptoMap()HashMapHashMap

myMap.entrySet().stream()
        .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
        .collect(Collectors.toMap(
                Map.Entry::getKey, 
                Map.Entry::getValue, 
                (x,y)-> {throw new AssertionError();},
                LinkedHashMap::new
        ));

使用静态导入,它变得更加愉快:

myMap.entrySet().stream()
        .sorted(comparingByValue(reverseOrder()))
        .collect(toMap(
                Map.Entry::getKey, 
                Map.Entry::getValue, 
                (x,y)-> {throw new AssertionError();},
                LinkedHashMap::new
        ));

答案 2

您可以通过任何您想要的比较器。comparingByValue

例如(我希望我的语法正确,因为我无法测试它):

myMap.entrySet().stream()
    .sorted(Map.Entry.comparingByValue((v1,v2)->v2.compareTo(v1)))
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

通过以相反的顺序比较两个条目的值,使用自然排序('s),你会得到一个相反的顺序,与(相当于)将给你的。ComparablecompareTocomparingByValue()comparingByValue((v1,v2)->v1.compareTo(v2))

顺便说一句,我不确定返回一个实例,即使它现在返回,将来也会改变,因为Javadoc没有提到它,所以你不能依赖它。Collectors.toMapLinkedHashMap

要确保生成的 Map 将是 LinkedHashMap,您应该使用 toMap 的不同变体:

myMap.entrySet().stream()
    .sorted(Map.Entry.comparingByValue((v1,v2)->v2.compareTo(v1)))
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (v1,v2)->v1, LinkedHashMap::new));

推荐