代码之家  ›  专栏  ›  技术社区  ›  Marty Pitt

Java转换{String,String }[]映射到字符串,字符串[]>

  •  3
  • Marty Pitt  · 技术社区  · 15 年前

    给定类:

     public class CategoryValuePair
     {
          String category;
          String value;
     }
    

    一种方法:

    public Map<String,List<String>> convert(CategoryValuePair[] values);
    

    鉴于在 values 我们可以收到许多相同类别的条目,我想将它们转换为 Map 按类别分组。

    是否有快速/有效的方法来执行此转换?

    4 回复  |  直到 15 年前
        1
  •  1
  •   True Soft    15 年前

    要减少代码行数,请使用 Google Collections :

    public Map<String, Collection<String>> convert(CategoryValuePair[] values) {
        Multimap<String, String> mmap = ArrayListMultimap.create();
        for (CategoryValuePair value : values) {
            mmap.put(value.category, value.value);
        }
        return mmap.asMap();
    }
    

    如果不想允许重复的值,请用hashmultimap替换arraylistmultimap。

        2
  •  2
  •   Andrei Fierbinteanu    15 年前

    据我所知,最简单的方法就是迭代值,然后将值放入映射中(就像一些预定义的方法)。

    Map<String, List<String>> map = new HashMap<String, List<String>>();
    if (values != null) {
        for (CategoryValuePair cvp : values) {
          List<String> vals = map.get(cvp.category);
          if (vals == null) {
            vals = new ArrayList<String>();
            map.put(cvp.category, vals);
          }
          vals.add(cvp.value);
        }
    }
    

    我把地图值从 String[] List<String> 因为对我来说使用它似乎更容易,所以您不必为数组大小调整而烦恼。

        3
  •  1
  •   Mario Fusco    15 年前

    lambdaj 您只需要一行代码就可以实现以下结果:

    group(values, by(on(CategoryValuePair.class).getCategory()));
    
        4
  •  0
  •   Favonius    15 年前

    只是为了实现…方法返回 Map 还要检查数组中的重复项…虽然从性能上看很重…

    public Map<String,String[]> convert(CategoryValuePair[] values)
    {
        Map<String, String[]> map = new HashMap<String, String[]>();
        for (int i = 0; i < values.length; i++) {
            if(map.containsKey(values[i].category)){
                Set<String> set = new HashSet<String>(Arrays.asList(map.get(values[i].category)));
                set.add(values[i].value);
                map.put(values[i].category, set.toArray(new String[set.size()]));
            }else {
                map.put(values[i].category, new String[]{values[i].value});
            }
        }
    
        return map;
    }