是否有一个通用的数据结构,表示Java中的列表映射

时间:2009-12-29 15:46:44

标签: java data-structures

我正在寻找具有Map<K, List<V>>

功能的通用数据结构

目前我所做的就像是

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

是不是有更通用的解决方案?我是在重新发明轮子(或者是不太重要的神器)

4 个答案:

答案 0 :(得分:7)

喜欢Google MultiMap ....或Apache Commons DefaultMapBag

就个人而言,我认为你的方法没有错。你正在缩短编写时间(而不是那么长),并且不要再依赖谷歌这样的第三方库。你的方法是可辩护的。

答案 1 :(得分:2)

我会选择Google Multimap。我不会使用Apache Commons Collections库,因为它不支持泛型,而且Google Collection库非常不错,所以我一直在使用而不是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 :(得分:2)

我倾向于将地图用于不可变的单链表,通常因历史原因将其称为Cons,其中列表以null终止。在这种情况下,上面的代码简化为:

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

因为使用null创建一个cons,因为它的尾部是有效的。

答案 3 :(得分:1)

核心Java中没有任何东西可以做你想要做的事情。

第三方库中可能有一些,但我总是编写自己的类,因为它相对简单。