2009-12-29 36 views
4
一個映射列出

我正在尋找具有的Map<K, List<V>>是否有代表在Java中

能力的通用數據sctructure一個共同的數據結構目前我做的是一樣的東西

public class MapOfLists <K,V>{ 

    private Map<K, List<V>> map = new HashMap<K, List<V>>(); 

    public void addItem(K key, V value){ 
     if(!map.containsKey(key)){ 
      map.put(key, new ArrayList<V>()); 
     } 
     List<V> list = map.get(key); 
     list.add(value); 
    } 
    ... 
} 

沒有更通用的解決方案嗎?我重新發明了車輪(或不太重要的工件)

回答

7

Google MultiMap ....或Apache Commons DefaultMapBag

就我個人而言,我沒有看到你的方法錯了。你花了很長的時間寫作(不用那麼長時間),並且堅持不要依賴像谷歌這樣的第三方庫。你的方法是可行的。

+0

由於我已經使用apache commons,他們身邊沒有解決方案嗎? – 2009-12-29 15:52:45

+1

是的,我已經添加了Apache Commons DefaultMapBag的鏈接。 – duffymo 2009-12-29 15:59:11

+0

再次感謝您的回答 – 2009-12-29 16:59:39

1

核心Java中沒有什麼能夠做你想做的事情。

在第三方庫中可能會有一些,但我總是寫自己的類,因爲它比較簡單。

+0

編寫代碼花費的時間不算什麼,問題是我花時間去了解是否有圖書館或在這裏提出這個問題,現在這是一個原因之一:) – 2011-07-05 20:13:15

2

我會去谷歌Multimap。我不會使用Apache Commons Collections庫,因爲它不支持泛型,並且Google Collection庫很不錯,所以我現在一直在使用Apache Commons Collections而不是Apache Commons Collections。關於Google Collections類中的所有類,甚至在Apache Commons Lang中的事情是,如果您查看其大多數方法,它們通常很小,並且一次編碼時會保存一行或兩行您。

但是從長遠來看,當你的代碼中沒有很多條件塊來檢查一個對象在[比較它] [2]之前是否爲空,或者如果一個列表存在於一個映射中,選擇(然後添加一個項目或創建列表並將其放入地圖),您的代碼將變得更具可讀性,並且噪音更小。

[2]:http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/ObjectUtils.html#equals(java.lang.Object,java.lang.Object中)

2

我傾向於使用一個映射到一個不可變的單鏈表,通常稱之爲Cons由於歷史原因,其中所述列表端接一個null。在這種情況下,上面的代碼簡化爲:

public void addItem(K key, V value) { 
    map.put (key, new Cons<V> (value, map.get (key))); 
} 

因爲具有空創建cons作爲尾是有效的。

+0

有趣的方法 – 2009-12-29 18:21:53