在学校里,我们要实施我们自己的班级MultiMap。
在实现remove方法时,我遇到了一些麻烦。
我的问题是,当我调用remove方法时,set.Remove(值)返回false。就像如果集合不包含对象一样。
我尝试从main中写出对象reference,从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);
}
}Main:
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);
}发布于 2013-11-04 16:15:43
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实现建议。
发布于 2013-11-04 16:04:18
第一个问题是您的put()方法。不要每次插入新元素时都创建一个新的HashSet。首先,应该使用containsKey()检查基础映射是否包含所提供的密钥。如果键存在,只需添加新值即可。否则,创建一个新的HashSet并保留代码。
然后,您必须修复您的remove()方法。如果密钥不存在,它将引发NullPointerException。事实上,map.get(key)将返回null,set.remove()将失败。
编辑:
关于您的多用户应用,请参见@Eugen Halca answer。在main()方法中,您正在添加Collection of Person,但试图删除单个Person。即使使用最好的Multimap实现,这也是行不通的;)
https://stackoverflow.com/questions/19771728
复制相似问题