如何使用lambda获得哈希映射中值的键值 [英] How to get the count of keys for values in a hash map using lambda

查看:125
本文介绍了如何使用lambda获得哈希映射中值的键值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个散列图

  Map< Integer,List< String>> Directmap = new HashMap< Integer,List< String>>(){{
put(0,Arrays.asList(a,b));
put(1,Arrays.asList(b,c));
put(2,Arrays.asList(d));
put(3,Arrays.asList(d,e));
put(4,Arrays.asList(e));
put(5,Arrays.asList());
}};

Directmap:{0 = [a,b],1 = [b ,2 = [d],3 = [d,e],4 = [e],5 = []}



我想计算每个值的键数。例如:a有一个键,b有两个键,...,e有两个键,分别是3和4.



我试过这样的事情:

  Map< Object,Long> ex = Directmap.entrySet()。stream()
.collect(Collectors.groupingBy(e - > e.getKey(),Collectors.counting()));

我想将键数作为输出值。像这样:

  a = [1],b = [2],c = [1],d = [2] ,e = [2] 


解决方案

平面映射地图的每个值。

在此代码中,只保留地图的值(因为您对按键不感兴趣)。每个值 List 都是平面映射的,这样Stream流水线就是 Stream< List< String>> code>变成流< String> 。最后,按照( groupingBy )身份函数和对元素执行的约简只是计算数字( counting() )。

  Map< String,Long> ex = 
Directmap.values()
.stream()
.flatMap(Collection :: stream)
.collect(Collectors.groupingBy(v - > v,Collectors。数数()));

请注意,如果一个值在初始映射中出现两次,它也会计算两次。如果要计算不同值的数量,可以添加对 Set )之前,清除 - rel =nofollow> distinct() c>而不是 List )。


I have a hash map

Map<Integer, List<String>> Directmap = new HashMap<Integer, List<String>>() {{
    put(0, Arrays.asList(a, b));
    put(1, Arrays.asList(b, c));
    put(2, Arrays.asList(d));
    put(3, Arrays.asList(d, e));
    put(4, Arrays.asList(e));
    put(5, Arrays.asList());
}};

Directmap: {0=[a, b], 1=[b, c], 2=[d], 3=[d, e], 4=[e], 5=[]}

I want to count the number of keys for each value. For example: "a" has one key, "b" has two keys, ..., "e" has two keys namely 3 and 4.

I tried something like this:

Map<Object, Long> ex = Directmap.entrySet().stream()
            .collect(Collectors.groupingBy(e -> e.getKey(), Collectors.counting()));

I want the values with number of keys as the output. Like this :

a=[1], b=[2], c=[1], d=[2], e=[2]

解决方案

You can do this by flat mapping each value of the map.

In this code, only the values of the map are kept (since you are not interested in the keys). Each value, which is a List<String> is flat mapped so that the Stream pipeline, which is Stream<List<String>> becomes Stream<String>. Finally, the Stream is grouped by (groupingBy) the identity function and the reduction performed on the elements is just counting the number of occurences (counting()).

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

Note that if a value is appearing twice in the initial map, it will also counted twice. If you want to count the number of distinct values, you can add a call to distinct() before collecting the result (or use a Set instead of a List).

这篇关于如何使用lambda获得哈希映射中值的键值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆