在学校我们要实现自己的MultiMap类。
当我实现删除方法时,我遇到了一些麻烦。
我的问题是当我调用remove方法时,set.Remove(value)返回false。就像该集合不包含该对象一样。
我试图写出来自main的对象引用,以及MultiMap类中的对象引用,并且对象似乎是相同的。
我在这里缺少什么?
提前致谢
这是我的地图代码:
public class MultiMap<K, V> {
private final Map<K, Set<V>> map = new HashMap<>();
public MultiMap() {
}
public String toString() {
StringBuilder sb = new StringBuilder();
Set<K> keys = map.keySet();
for (K k : keys) {
sb.append("key ");
sb.append(k);
sb.append(" Value ");
sb.append(map.get(k));
}
return sb.toString();
}
public int size() {
return map.size();
}
public boolean put(K key, V value) {
Set<V> set;
if (map.containsKey(key)) {
set = map.get(key);
set.add(value);
} else {
set = new HashSet<>();
set.add(value);
}
return (map.put(key, set) != null) ? false : true;
}
public Set<V> get(K key) {
return map.get(key);
}
public void remove(K key, V value) {
Set<V> set = map.get(key);
System.out.println(value);
System.out.println(set.remove(value));
if(set.isEmpty()) {
map.remove(key);
}
}
主要:
public static void main(String[] args) {
Person p = new Person("navn");
Collection<Person> set = new HashSet<>();
set.add(p);
MultiMap map = new MultiMap<>();
map.put(1, set);
System.out.println(map.toString());
System.out.println(map.get(1));
map.remove(1, p);
}
答案 0 :(得分:4)
第一个问题出在您的put()
方法中。每次插入新元素时都不应创建新的HashSet
。
您应首先使用containsKey()
检查基础地图是否包含提供的密钥。如果密钥存在,只需添加新值。否则,请创建一个新的HashSet
并保留您的代码。
然后,您必须修复remove()
方法。如果密钥不存在,它将引发NullPointerException
。实际上,map.get(key)
将返回null
而set.remove()
将失败。
修改强>
有关您的Multimap使用情况,请参阅@Eugen Halca answer。在main()
方法中,您要添加Collection
Person
,但尝试删除单个Person
。即使使用最佳Multimap
实现,也无效;)
答案 1 :(得分:1)
你remove
会返回false
,因为你试图删除Person
个对象,但是你没有map
。
请注意,您要将Collection<Person>
添加到map
,但尝试删除Person
,显然这两个对象不是equal
,因此您获得false
值。
之后:map.put(1, set);
在记忆中你有类似的东西:
1=>[[p]];
但是,我想,你期望1=>[p]
。
只需将map.put(1,set);
替换为map.put(1,p);
另请参阅Guillaume Poussel
答案,了解正确的MultiMap实施建议。