如何在java流中按降序排序LinkedHashMap?

时间:2015-04-25 03:29:20

标签: java sorting java-8 java-stream linkedhashmap

要按升序对其进行排序,我可以使用:

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

我该如何按降序排列?

4 个答案:

答案 0 :(得分:34)

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

要获得LinkedHashMap,您必须明确要求使用4个参数toMap()。如果您没有指定所需的地图类型,您将获得默认的任何内容,当前恰好是HashMap。由于HashMap不保留元素的顺序,因此绝对不适合你。

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
        ));

答案 1 :(得分:5)

你可以传递你想要的任何比较者comparingByValue

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

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

通过比较相反顺序的两个条目的值,使用自然排序(Comparable的{​​{1}}),与compareTo相比得到一个相反的顺序(相当于comparingByValue())会给你。

顺便说一句,我不确定comparingByValue((v1,v2)->v1.compareTo(v2))是否会返回Collectors.toMap个实例,即使它当前有,也会在将来发生变化,因为Javadoc没有提及它,所以你不能依赖它。

要确保生成的Map是LinkedHashMap,您应该使用toMap的其他变体:

LinkedHashMap

答案 2 :(得分:3)

Stream有interface方法接受比较器,因此您可以直接使用比较器sorted进行降序排序。 要按升序对地图进行排序,我们可以将排序反转为(x,y)->y.getKey().compareTo(x.getKey())

为了将结果合并回LinkedHashMap,我们可以使用收集器(x,y)->x.getKey().compareTo(y.getKey()) 返回一个收集器,它将元素累积到一个Map中,其键和值是将提供的映射函数应用于输入元素的结果。

工作代码

toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)

答案 3 :(得分:2)

自Java 1.8以来 java.util.Comparator.reversed()

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