java – 将地图转换为地图>

我有地图如下
Map<String,String> values = new HashMap<String,String>();
values.put("aa","20");
values.put("bb","30");
values.put("cc","20");
values.put("dd","45");
values.put("ee","35");
values.put("ff","35");
values.put("gg","20");

我想以Map< String,List< String>>的格式创建新的地图.,样品输出将为

"20" -> ["aa","cc","gg"]
"30" -> ["bb"]
"35" -> ["ee","ff"]     
"45" -> ["dd"]

我可以通过实体迭代来做

Map<String,List<String>> output = new HashMap<String,List<String>>();
    for(Map.Entry<String,String> entry : values.entrySet()) {
        if(output.containsKey(entry.getValue())){
            output.get(entry.getValue()).add(entry.getKey());

        }else{
            List<String> list = new ArrayList<String>();
            list.add(entry.getKey());
            output.put(entry.getValue(),list);
          }
    }

使用流可以做得更好吗?

解决方法

groupingBy可以用于按键分组.如果在没有映射收集器的情况下使用,则将映射条目流(Stream< Map.Entry< String,String>)转换为Map< String,List< Map.Entry< String,String>>接近你想要的,但不完全.

为了将输出Map的值作为原始键的列表,必须将映射收集器链接到groupingBy Collector.

Map<String,List<String>> output =
    values.entrySet()
          .stream()
          .collect(Collectors.groupingBy(Map.Entry::getValue,Collectors.mapping(Map.Entry::getKey,Collectors.toList())));
System.out.println (output);

输出

{45=[dd],35=[ee,ff],30=[bb],20=[aa,cc,gg]}

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...