我有一个这样的HashMap
:
Map<String, List<String>> map = new HashMap<>();
map.put("USA", Arrays.asList("CA","IA","IL"));
map.put("India", Arrays.asList("MUM","CAL"));
map.put("Canada", Arrays.asList("TOR"));
我希望根据列表值的大小,按升序对地图进行排序。我怎么能这么做?
在这种情况下,我想要的钥匙是加拿大,印度,美国。
发布于 2015-06-15 11:30:03
HashMap
没有保证的迭代顺序,因此您需要收集到一个LinkedHashMap
,这样排序才有意义。
import static java.util.Comparator.comparingInt;
import static java.util.stream.Collectors.toMap;
Map<String, List<String>> sorted = map.entrySet().stream()
.sorted(comparingInt(e -> e.getValue().size()))
.collect(toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(a, b) -> { throw new AssertionError(); },
LinkedHashMap::new
));
抛出AssertionError
是因为组合器函数是only used on parallel streams,我们不使用它。
如果您发现comparingByValue
更具可读性,也可以使用它:
import static java.util.Map.Entry.comparingByValue;
Map<String, List<String>> sorted = map.entrySet().stream()
.sorted(comparingByValue(comparingInt(List::size)))
// ... as above
发布于 2015-06-15 11:17:13
你有两个问题。
因此,使用Map或SortedMap不会对您有所帮助。您需要做的是对映射进行迭代,并将每个Entry<String, ArrayList<String>>
放入一个集合中,例如列表,然后使用自定义比较对列表进行排序。请参阅此示例TreeMap sort by value或此示例Sorting LinkedHashMap
发布于 2021-08-03 03:28:46
您可以简单地将哈希映射到结对()列表,然后对列表进行排序
val map: MutableMap<String, List<String>> = HashMap()
map["USA"] = listOf("CA", "IA", "IL")
map["India"] = listOf("MUM", "CAL")
map["Canada"] = listOf("TOR")
val sortedPairs = map.map { Pair(it.key, it.value) }.sortedBy { it.second.size }.toMap()
println("sorted List: $sortedPairs")
https://stackoverflow.com/questions/30853117
复制相似问题