Java将{String,String} []转换为Map <string,string []> </string,string []>

时间:2010-06-24 06:58:15

标签: java collections

鉴于课程:

 public class CategoryValuePair
 {
      String category;
      String value;
 }

一种方法:

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

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

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

4 个答案:

答案 0 :(得分:2)

据我所知,没有比迭代值更简单的方法,然后将值放在地图中(就像某些预定义的方法)。

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>,因为我似乎更容易使用它,因此您不必为数组大小调整而烦恼。

答案 1 :(得分:1)

要使用更少的代码行,请使用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();
}

如果您不想允许重复值,请将ArrayListMultimap替换为HashMultimap。

答案 2 :(得分:1)

使用lambdaj,您只需要一行代码即可实现以下结果:

group(values, by(on(CategoryValuePair.class).getCategory()));

答案 3 :(得分:0)

只是为了实现...该方法返回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;
}