我使用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);
奇怪的是,当使用Integer
和comparingByValue
方法时,它会对comparingByKey
键进行排序。所以它肯定是排序,而不是String
值,但在两种情况下都是Integer
键。我不明白我在这里做错了什么。
答案 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
如何对键进行分组。