Map< String,List< String>的Collectors.groupby; [英] Collectors.groupby for Map<String,List<String>

查看:74
本文介绍了Map< String,List< String>的Collectors.groupby;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果解决方案非常明显,请原谅我,但我似乎不知道该怎么做

Forgive me if the solution is very obvious but I can't seem to figure out how to do this

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]}

I want to group by based on values in hashmap. I want the output to be {a1=[b1, b3], a2=[b2]} but it is currently coming as {a1=[a1, a1], a2=[a2]}

推荐答案

当前,您正在对地图值进行流式处理(我认为这是一个错字),根据所需的输出,您应该在地图上进行流式处理entrySet并使用基于地图值的groupingBymapping作为基于地图键的下游收集器:

Currently, you're streaming over the map values (which I assume is a typo), based on your required output you should stream over the map entrySet and use groupingBy based on the map value's and mapping as a downstream collector based on the map key's:

 Map<String, List<String>> result = map.entrySet()
            .stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue,
                          Collectors.mapping(Map.Entry::getKey, 
                                        Collectors.toList())));

您还可以通过forEach + computeIfAbsent在没有流的情况下执行此逻辑:

You could also perform this logic without a stream via forEach + computeIfAbsent:

Map<String, List<String>> result = new HashMap<>();
map.forEach((k, v) -> result.computeIfAbsent(v, x -> new ArrayList<>()).add(k));

这篇关于Map&lt; String,List&lt; String&gt;的Collectors.groupby;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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