2010-06-24 142 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

相關問題