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

Oxy*_*ron 15 java sorting linkedhashmap java-8 java-stream

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

myMap.entrySet().stream()
    .sorted(Map.Entry.comparingByValue())
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

我怎么能按降序排列呢?

Mis*_*sha 38

要按相反顺序排序,请将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
        ));
Run Code Online (Sandbox Code Playgroud)

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

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


Era*_*ran 5

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

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

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

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

顺便说一句,我不确定它是否会Collectors.toMap返回一个LinkedHashMap实例,即使它现在也是如此,它可以在将来发生变化,因为Javadoc没有提及它,所以你不能依赖它.

要确保生成的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));
Run Code Online (Sandbox Code Playgroud)