java – 将地图转换为地图>

前端之家收集整理的这篇文章主要介绍了java – 将地图转换为地图>前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有地图如下
  1. Map<String,String> values = new HashMap<String,String>();
  2. values.put("aa","20");
  3. values.put("bb","30");
  4. values.put("cc","20");
  5. values.put("dd","45");
  6. values.put("ee","35");
  7. values.put("ff","35");
  8. values.put("gg","20");

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

  1. "20" -> ["aa","cc","gg"]
  2. "30" -> ["bb"]
  3. "35" -> ["ee","ff"]
  4. "45" -> ["dd"]

我可以通过实体迭代来做

  1. Map<String,List<String>> output = new HashMap<String,List<String>>();
  2. for(Map.Entry<String,String> entry : values.entrySet()) {
  3. if(output.containsKey(entry.getValue())){
  4. output.get(entry.getValue()).add(entry.getKey());
  5.  
  6. }else{
  7. List<String> list = new ArrayList<String>();
  8. list.add(entry.getKey());
  9. output.put(entry.getValue(),list);
  10. }
  11. }

使用流可以做得更好吗?

解决方法

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

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

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

输出

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

猜你在找的Java相关文章