java - 如何使用 flatmap java8 根据值的键数对 HashMap 进行排序?

标签 java hash lambda java-8 java-stream

这是 How to get the count of keys for values in a hash map using 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 只有两个键。

最佳答案

你可以有以下内容:

Map<Integer, List<Integer>> sorted = 
    map.entrySet()
       .stream()
       .sorted(comparing(e -> ex.get(e.getKey()), reverseOrder()))
       .collect(toMap(
           Map.Entry::getKey,
           e -> e.getValue().stream().sorted(comparing(ex::get, reverseOrder())).collect(toList()),
           (v1, v2) -> { throw new IllegalStateException(); },
           LinkedHashMap::new
       ));

这将创建映射条目的 Stream,根据该条目的键的键数以相反的顺序对它们进行排序,最后将其收集到一个映射中,在该映射中,新值按照与每个整数 (ex::get)。收集 map 是一个 LinkedHashMap 以保持遇到顺序。

输出:

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

使用的静态导入:

import static java.util.Comparator.comparing;
import static java.util.Comparator.reverseOrder;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;

关于java - 如何使用 flatmap java8 根据值的键数对 HashMap 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34575726/

相关文章:

java - 检测所有摄像头android

java - "Missing columns in relationship"创建表时

java - JasperReport & 填充组件

python - Ruby 哈希相当于 Python dict setdefault

python - Pandas Dataframe groupby + agg + lambda + unique 抛出 ValueError

java - 奥利奥后通知背景颜色

c# - .NET 中 String.GetHashCode() 的哈希质量和稳定性?

c++ - 逐行散列文件时错误的 md5 散列值

c# - 如何使用 lambda 表达式将 IQueryable<Anonymous Type> 转换/转换为 IQueryable<Strongly Typed Object>

python - 无法将信息传递给回调函数