How can I sort a Map based upon on the size of its Collection values?

后端 未结 2 1313
你的背包
你的背包 2020-12-08 23:36

I have a HashMap like this:

Map> map = new HashMap<>();

map.put(\"USA\", Arrays.asList(\"CA\",\"IA\",\"I         


        
相关标签:
2条回答
  • 2020-12-08 23:40

    HashMap does not have a guaranteed iteration order so you will need to collect to a LinkedHashMap in order for the sorting to be meaningful.

    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
        )); 
    

    The AssertionError is thrown because a combiner function is only used on parallel streams, which we are not using.

    You can also use comparingByValue if you find it more readable:

    import static java.util.Map.Entry.comparingByValue;
    
    Map<String, List<String>> sorted = map.entrySet().stream()
        .sorted(comparingByValue(comparingInt(List::size)))
        // ... as above
    
    0 讨论(0)
  • 2020-12-08 23:50

    You have two problems.

    1. Map doesn't support sorting.

    2. SortedMap doesn't support sorting on values only sorting on keys.

    As a result of this using a Map or SortedMap isn't going to help you. What you need to do is iterate over you map and put each Entry<String, ArrayList<String>> into a collection such as a List and then sort the list with a custom compare. See this example TreeMap sort by value or this example Sorting LinkedHashMap

    0 讨论(0)
提交回复
热议问题