如何使用flatmap java8基于键的数量为一个值排序哈希映射?


Answers

Question

这是如何获得使用lambda散列映射中的值的键计数的后续。 我有一个HashMap ,我想找到每个值的键数

Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>() {{
    put(0, Arrays.asList(1, 2));
    put(1, Arrays.asList(2, 0, 3));
    put(2, Arrays.asList(4,0,1));
    put(3, Arrays.asList(4,1, 5));
    put(4, Arrays.asList(5,2,3));
    put(5, Arrays.asList(4,3));
}};

根据上面的帖子,我尝试了平面映射:

Map<Object, Long> ex = 
                map.values()
                .stream()
                .flatMap(Collection::stream)
                .collect(Collectors.groupingBy(v -> v, Collectors.counting()));

System.out.println(ex);

输出是

{0=2, 1=3, 2=3, 3=3, 4=3, 5=2}. 

这意味着0有两个键,1有三个键等等。 现在我想根据键的数量以降序对键和值进行排序。 我尝试了这样的事情:

Map<Object, Long> ex = 
                map.values()
                .stream()
                .flatMap(Collection::stream)
                .collect(Collectors.groupingBy(v -> v, Collectors.counting()));

                        .entrySet()
                        .stream()
                        .sorted(Map.Entry.<String, Long>comparingByValue(reverseOrder()).thenComparing(Map.Entry.comparingByKey()))
                        .collect(LinkedHashMap::new, (m,e) -> m.put(e.getKey(), e.getValue()), Map::putAll);

我想要以下输出:

1=[2, 3, 0], 2=[1,4,0], 3=[1, 4, 5], 4=[2, 3, 5], 0=[1, 2], 5=[3, 4]

键和值应该按照这个键计数下降排列{0=2, 1=3, 2=3, 3=3, 4=3, 5=2} :1,2,3,4有三个键,0和5有两个键。

例如: 1=[2, 3, 0] :1有三个键,所以它首先以[2, 3, 0] :2和3有三个键,0只有两个键。