![](/img/trans.png)
[英]How to iterate Object in stream while using Collectors.groupby()
[英]Collectors.groupby for Map<String,List<String>
如果解决方案非常明显,请原谅我,但我似乎无法弄清楚如何做到这一点
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("b1", "a1");
map.put("b2", "a2");
map.put("b3", "a1");
Map<String, List<String>> mm = map.values().stream().collect(Collectors.groupingBy(m -> m));
System.out.println(mm);
}
我想根据哈希图中的值进行分组。 我希望输出为{a1=[b1, b3], a2=[b2]}
但它目前是{a1=[a1, a1], a2=[a2]}
目前,您正在流式传输地图值(我假设是一个拼写错误),根据您所需的输出,您应该在地图entrySet
上流式传输,并根据地图值使用groupingBy
并根据地图键mapping
为下游收集器:
Map<String, List<String>> result = map.entrySet()
.stream()
.collect(Collectors.groupingBy(Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey,
Collectors.toList())));
您也可以通过forEach
+ computeIfAbsent
没有流的情况下执行此逻辑:
Map<String, List<String>> result = new HashMap<>();
map.forEach((k, v) -> result.computeIfAbsent(v, x -> new ArrayList<>()).add(k));
您可以将Collectors.mapping
与Collectors.groupingBy
一起使用在地图的entrySet
上:
Map<String, List<String>> mm = map.entrySet()
.stream()
.collect(Collectors.groupingBy(Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
但它目前正在{a1 = [a1,a1],a2 = [a2]}
那是因为您当前正在对值集合进行分组{a1, a2, a1}
仅限于{a1, a2, a1}
。
public class Test5 {
public static void main(String[] args) {
List<String> list1 = List.of("Tabu", "Gina", "protijayi", "Gini", "Gini","North Calcutta");
List<String> list2 = List.of("Soudipta", "Gina", "Gina", "upto");
List<String> list3 = List.of("Soudipta", "Gina", "protijayi", "Tabu","South Calcutta");
List<List<String>> listres = List.of(list1, list2, list3);
System.out.println(listres);
/*
[[Tabu, Gina, protijayi, Gini, Gini, North Calcutta],
[Soudipta, Gina, Gina, upto],
[Soudipta, Gina, protijayi, Tabu, South Calcutta]]
*/
Map<String, List<Long>> FirstKeyThenValue1 = listres.stream().flatMap(
// mapper
list -> list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().parallelStream()
).collect(Collectors.groupingBy(Entry::getKey, Collectors.mapping(
// mapper, downstream
Entry::getValue, Collectors.toList())));
System.out.println("FirstKeyThenValue1 -> " + FirstKeyThenValue1);
/*
{
upto=[1],
Soudipta=[1, 1],
Gina=[1, 2, 1],
Tabu=[1, 1],
North Calcutta=[1],
South Calcutta=[1],
protijayi=[1, 1],
Gini=[2]}
*/
Map<Long, List<String>> FirstValueThenkey1 = listres.stream().flatMap(
// mapper
list -> list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
).collect(
Collectors.groupingBy(Entry::getValue, Collectors.mapping(
Entry::getKey, Collectors.toList()
))
);
System.out.println(" FirstValueThenkey1 => " + FirstValueThenkey1);
/*
{
1=[Gina, Tabu, North Calcutta, protijayi, upto, Soudipta,
Soudipta, Gina, Tabu, South Calcutta, protijayi],
2=[Gini, Gina]
}
*/
}// main
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.