2009-12-29 38 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