使用Java 8 Stream对HashMap字符串值进行排序不起作用

时间:2016-06-02 12:18:29

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

我使用this问题中的解决方案对LinkedHashMap中的字符串值进行排序。然而,排序根本不起作用。这是我写的代码。

Map<Integer, String> sortedMap = myMap.entrySet().stream()
                .sorted(Map.Entry.comparingByValue())
                .collect(Collectors.toMap(Map.Entry<Integer, String>::getKey, 
                    Map.Entry<Integer, String>::getValue));

myMap = new LinkedHashMap<Integer, String>(sortedMap);

奇怪的是,当使用IntegercomparingByValue方法时,它会对comparingByKey键进行排序。所以它肯定是排序,而不是String值,但在两种情况下都是Integer键。我不明白我在这里做错了什么。

2 个答案:

答案 0 :(得分:6)

您正在使用的toMap收集器将元素放在HashMap中,因此排序对此没有帮助,因为您最终将它们放入非有序集合中。

使用重载的toMap方法,并提供LinkedHashMap作为具体实例,即:

Map<Integer, String> sortedMap = 
     myMap.entrySet()
          .stream()
          .sorted(Map.Entry.comparingByValue())
          .collect(Collectors.toMap(Map.Entry::getKey,
                                    Map.Entry::getValue, 
                                    (a, b) -> a, //or throw an exception
                                    LinkedHashMap::new));

答案 1 :(得分:2)

我的猜测是Collectors.toMap会在无序地图中收集它们,立即破坏排序。

尝试直接在LinkedHashMap

中收集它们
LinkedHashMap<Integer, String> newMap = new LinkedHashMap<>();
Map<Integer, String> sortedMap = myMap.entrySet().stream()
                .sorted(Map.Entry.comparingByValue())
                .collect((k, v) -> newMap.put(k, v));
myMap = newMap;

至于为什么对整数键进行排序:这可能仅仅是巧合,基于HashMap如何对键进行分组。