我正在寻找具有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);
}
...
}
是不是有更通用的解决方案?我是在重新发明轮子(或者是不太重要的神器)
答案 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中没有任何东西可以做你想要做的事情。
第三方库中可能有一些,但我总是编写自己的类,因为它相对简单。