【发布时间】:2016-01-03 10:56:08
【问题描述】:
这是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 只有两个键。
【问题讨论】:
-
检查:stackoverflow.com/questions/109383/…,基本上使用树形图和比较器
-
@LouisF。是的,我查过了。如果我使用比较器,我可以得到以下输出,{1=3, 2=3, 3=3, 4=3, 0=2, 5=2}。但我想要的是 1=[2, 3, 0], 2=[1,4,0], 3=[1, 4, 5], 4=[2, 3, 5], 0=[1, 2], 5=[3, 4]。那么是否有任何预定义的函数可以使用流在 java8 中根据值的键数进行排序?
-
我对java 8很陌生。所以真的不知道如何执行。有什么想法吗?
-
在这里您要对键和值列表进行排序。首先使用 TreeMap 和自定义比较器对键进行排序。然后尝试对每个值列表进行排序。即使可以,也不要尝试混合所有内容,这会损害可读性。
标签: java hash lambda java-8 java-stream