[英]How can I group values of List in Java using Lambda like we do in python
I want to group values of a map based on the key. 我想基于键对地图的值进行分组。 Let's say
比方说
Map<String,Integer> map1 = new TreeMap<String,Integer>();
map1.put("D", 3);
map1.put("B", 2);
map1.put("C", 1);
Map<String,Integer> map2 = new TreeMap<String,Integer>();
map2.put("A", 13);
map2.put("B", 22);
map2.put("C", 12);
Map<String,Integer> map3 = new TreeMap<String,Integer>();
map3.put("A", 33);
map3.put("B", 32);
map3.put("C", 32);
Map<Integer,Map<String,Integer>> map = new HashMap <Integer,Map<String,Integer>>();
map.put(1,map1);
map.put( 2, map2);
map.put(3, map3);
System.out.println(map);
I want to group values in the map based on the keys: Output should be ["A","B","C"]:[2,3], ["D","B","C"]:[1]
我想根据键对映射中的值进行分组:输出应为
["A","B","C"]:[2,3], ["D","B","C"]:[1]
So what I have done: 所以我做了什么:
Map<List<String>, List<Integer>> newMap = new HashMap<List<String>, List<Integer>>();
for (Integer item : map) {
Map<String,Integer> currentValue = map.get(item);
List<String> oldItemKeySet = newMap.get(currentValue.keySet());
newMap.put(currentValue.keySet(), (oldItemKeySet == null) ? 1 : oldItemKeySet.put());
}
But it doesn't work out, can anyone help here. 但这行不通,任何人都可以在这里提供帮助。
PS: In Python, these things can be done with itertools.groupby
or reduce
, but i am still don't knoww how to do it perfectly in Java PS:在Python中,这些事情可以通过
itertools.groupby
或reduce
来完成,但是我仍然不知道如何在Java中完美地做到这一点。
If I understand well, you want to group the identical key set of the maps you added in the last map associated with the original key. 据我所知,您希望将在与原始键关联的最后一个映射中添加的映射的相同键集进行分组。
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
...
Map<Set<String>, List<Integer>> newMap =
map.entrySet()
.stream()
.collect(groupingBy(e -> e.getValue().keySet(),
mapping(Map.Entry::getKey, toList())));
From the last map, you get the stream of entries (which is a Stream<Entry<Integer, Map<String, Integer>>
). 从最后一个映射中,获得条目流(它是
Stream<Entry<Integer, Map<String, Integer>>
)。 There you group the entries by the key set of their map's values. 在那里,您可以根据地图值的键集对条目进行分组。
Then you map the values of the resulting map using a downstream collector, which collects the keys of the original entries in a List<Integer>
. 然后,使用下游收集器映射结果映射的值,该收集器将原始条目的键收集在
List<Integer>
。
Output: 输出:
{[A, B, C]=[2, 3], [B, C, D]=[1]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.