2010-06-24 172 views
3

鉴于类:Java的转换{字符串,字符串} []地图<字符串,字符串[]>

public class CategoryValuePair 
{ 
     String category; 
     String value; 
} 

与方法:

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

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

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

+0

快速/高效的代码或在运行时间,性能方面行方面? – vodkhang 2010-06-24 07:04:13

+2

您在地图中使用String []而不是'List '的任何特定原因?我想不出为什么这个数组会更好,并且考虑到你的问题,我想到的方式有很多原因,这个列表会让它更容易一些。 – 2010-06-24 07:04:20

+0

@vodkhang - 首先表现,代码行是奖励。 – 2010-06-24 07:10:41

回答

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(); 
} 

如果你不希望允许重复的值,与HashMultimap更换ArrayListMultimap。

+0

+1不重新发明轮子 – 2010-06-24 13:12:42

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>,因为它似乎更容易给我使用,所以你不必与阵列调整到麻烦。

+3

性能:为什么每次都将列表放入地图中,只有在创建新列表时才执行此操作。 if(vals == null){vals = new ArrayList (); map.put(cvp.category,vals); }' – 2010-06-24 07:18:13

+0

我同意你卡洛斯。 如果密钥已知,put方法将不会将值插入到映射中... – Fred 2010-06-24 07:22:44

+0

如果值的值为空值,则代码将引发NullPointerException。 – Fred 2010-06-24 07:26:32

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; 
} 
+0

我不确定你的代码可以编译... – Fred 2010-06-24 07:19:24

+0

@Fred 那么它实际编译:) – Favonius 2010-06-24 07:22:56

+0

因为你已经编辑你的代码...当我写我的if语句时不存在评论... – Fred 2010-06-24 07:24:54

1

随着lambdaj你只需要一行代码来达到这种效果,因为它遵循:

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

我是这是lambdaj项目的忠实粉丝,图书馆已经在讨论该项目。我不知道为什么我没有想到使用这个。 但是,就性能而言,我怀疑Google Collections方法可能会更快。(纠正我,如果我错了) – 2010-06-24 20:54:25

+0

作为vodkhang问你的意思是“快速/有效的代码行或在运行时间,性能方面”?如果你正在寻找一些非常可读和简洁的东西,我相信lambdaj可能是最好的解决方案(免责声明:我是lambdaj的创造者)。如果性能是您最关心的问题,那么即使您的lambdaj的群组功能是最佳性能表现之一,也应该选择Google集合,因为您可以从项目文档中阅读。我最后的建议是提供一个解决方案的机会,并写一个小线束来比较他们的表现。让我知道你会找到什么。 – 2010-06-24 22:00:10

相关问题