Java将{String,String}[]转换为映射<;字符串,字符串[]>;

Java将{String,String}[]转换为映射<;字符串,字符串[]>;,java,collections,Java,Collections,鉴于班级: public class CategoryValuePair { String category; String value; } 以及一种方法: public Map<String,List<String>> convert(CategoryValuePair[] values); 公共地图转换(CategoryValuePair[]值); 考虑到在values中,我们可以收到许多具有相同类别的条目,我想将这些条目转换为一

鉴于班级:

 public class CategoryValuePair
 {
      String category;
      String value;
 }
以及一种方法:

public Map<String,List<String>> convert(CategoryValuePair[] values);
公共地图转换(CategoryValuePair[]值);
考虑到在
values
中,我们可以收到许多具有相同类别的条目,我想将这些条目转换为一个按类别分组的
Map


有没有一种快速有效的方法来执行此转换?

据我所知,没有比迭代值,然后将值放入映射(如某些预定义方法)更简单的方法了

Map Map=newhashmap();
如果(值!=null){
for(类别值对cvp:值){
列表VAL=map.get(cvp.category);
如果(VAL==null){
VAL=新的ArrayList();
map.put(cvp.category,VAL);
}
VAL.add(cvp.value);
}
}

我将映射值从
String[]
更改为
List
,因为我觉得使用它更容易,所以您不必为调整数组大小而烦恼。

只是为了实现。。。该方法返回
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;
}
公共映射转换(CategoryValuePair[]值)
{
Map Map=newhashmap();
对于(int i=0;i
要减少代码行数,请使用:

公共映射转换(CategoryValuePair[]值){
Multimap mmap=ArrayListMultimap.create();
for(类别值对值:值){
mmap.put(value.category,value.value);
}
返回mmap.asMap();
}
如果不希望允许重复值,请将ArrayListMultimap替换为HashMultimap。

只需一行代码即可实现该结果,如下所示:

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

在代码行或运行时间、性能方面快速/高效?您在地图中使用
String[]
而不是
List
有什么特殊原因吗?我想不出为什么数组会更好的原因有很多,关于你的问题,按照我的想法,这个列表会让它更容易一些。@vodkhang-性能第一,代码行是一个奖励。@lauri lehtinen有,但不是一个很好的列表。为了回答这个问题,我把它改成了列表。谢谢性能:为什么每次都将列表放入映射中,只有在创建新列表时才这样做
if(vals==null){vals=newarraylist();map.put(cvp.category,vals);}
。如果键已知,则put方法不会将值插入映射中…如果值为空值,则代码将抛出NullPointerException。@实际上它已编译:),因为您已编辑代码。。。当我写评论时,if子句不存在……哦,我不得不。。我使用了pre和code标签来格式化我的代码。。。把一切都搞砸了。。。抱歉搞混了…我是lambdaj项目的忠实粉丝,而这个库已经在讨论中的项目中了。我不知道为什么我没有想到用这个。然而,就性能而言,我怀疑Google Collections方法可能更快。(如果我错了,请纠正我)正如沃德康所问的那样,您的意思是“在代码行方面或在运行时间、性能方面快速/高效”吗?如果您正在寻找一些非常可读和简洁的东西,我相信lambdaj可能是最好的解决方案(免责声明:我是lambdaj的创建者)。如果性能是您最关心的问题,那么您可能应该选择Google Collection,即使lambdaj的组功能是性能最好的功能之一,正如您从项目文档中可以看到的那样。我最后的建议是给这两种解决方案一个机会,并编写一个小工具来比较它们的性能。让我知道你会发现什么。
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();
}
group(values, by(on(CategoryValuePair.class).getCategory()));