我想用Java制作集合地图,所以我可以制作类似的东西
public void add(K key, V value) { if (containsKey(key)) { get(key).add(value); } else { Collection c = new Collection(); c.add(value); put(key, value); } }
我试图用类似的东西制作它
public class CollectionMap> extends HashMap
但编译器抱怨该
部分,并且仍然存在制作适当的新集合的问题.
目前,我已经创建了两个类:SetMap,看起来像这样
1: public class SetMapextends HashMap > { 2: 3: public void add(K key, V value) { 4: if (containsKey(key)) { 5: get(key).add(value); 6: } else { 7: Set list = new HashSet (); 8: list.add(value); 9: put(key, list); 10: } 11: } 12: 13: }
和ListMap看起来几乎相同,除了我创建新ArrayList的第7行.这种重复小到可以容忍,但问题仍然存在于Java中这种"嵌套泛型"可能吗?
编辑:
正如埃里克森所说,解决方案>
不仅仅是解决方案>
所以代码看起来像
public abstract class CollelctionMap> extends HashMap { protected abstract C newCollection(); public void add(K key, V value) { if (containsKey(key)) { get(key).add(value); } else { C c = newCollection(); c.add(value); put(key, c); } } }
而ListMap和SetMap只提供适当的集合
如果map
是a Map
,请使用成语computeIfAbsent(...).add(...)
,如下所示:
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
或者,对于Set
:
map.computeIfAbsent(key, k -> new HashSet<>()).add(value);
如果是一个选项,您可能只想使用Google Collections API - http://code.google.com/p/google-collections/.
即使你不能使用它,也许看看他们如何实现他们的MultiMaps将帮助你实现.