繁体   English   中英

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

[英]Java convert {String,String}[] to Map<String,String[]>

鉴于课程:

 public class CategoryValuePair
 {
      String category;
      String value;
 }

一个方法:

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

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

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

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

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

要使用更少的代码行,请使用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。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM