如何根据地图集合值的大小对地图进行排序?

2022-09-04 07:56:30

我有一个这样的: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"));

我想根据列表值的大小以升序对地图进行排序。我该怎么做?

在这种情况下,我希望订购加拿大,印度,美国的钥匙。


答案 1

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

如果您发现它更具可读性,也可以使用compareByValue

import static java.util.Map.Entry.comparingByValue;

Map<String, List<String>> sorted = map.entrySet().stream()
    .sorted(comparingByValue(comparingInt(List::size)))
    // ... as above

答案 2

你有两个问题。

  1. 地图不支持排序。

  2. SortedMap 不支持仅对值进行排序,仅支持按键排序。

因此,使用Map或SortedMap不会对您有所帮助。您需要做的是循环访问映射并将每个映射放入一个集合(如 List)中,然后使用自定义比较对列表进行排序。请参阅此示例 TreeMap 按值排序或此示例排序 LinkedHashMapEntry<String, ArrayList<String>>


推荐