作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想用 Java 制作集合 map ,所以我可以制作类似的东西
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<K, C extends Collection<V>> extends HashMap<K, C>
但是编译器提示 <V>
部分,并且仍然存在制作适当的新系列的问题。
目前,我做了两个类:SetMap 看起来像这样
1: public class SetMap<K, V> extends HashMap<K, Set<V>> {
2:
3: public void add(K key, V value) {
4: if (containsKey(key)) {
5: get(key).add(value);
6: } else {
7: Set<V> list = new HashSet<V>();
8: list.add(value);
9: put(key, list);
10: }
11: }
12:
13: }
和 ListMap 看起来几乎一样,除了第 7 行我创建了新的 ArrayList。这种重复小到可以容忍,但问题是这种“嵌套泛型”在 Java 中是否可能?
编辑:
作为erickson said , 解决方案在 <A, B extends Something<A>>
而不仅仅是 <B extends Something<A>>
所以代码看起来像
public abstract class CollelctionMap<K, V, C extends Collection<V>> extends HashMap<K, C> {
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
是 Map<K, Collection<V>>
, 使用成语 computeIfAbsent(...).add(...)
,像这样:
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
或者,对于 Set
:
map.computeIfAbsent(key, k -> new HashSet<>()).add(value);
关于java - 馆藏 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/254351/
我想用 Java 制作集合 map ,所以我可以制作类似的东西 public void add(K key, V value) { if (containsKey(key)) {
我是一名优秀的程序员,十分优秀!