从multiMap中移除

3
在学校,我们需要实现自己的MultiMap类。
当我正在实现remove方法时,遇到了一些问题。
我的问题是当我调用remove方法时,set.Remove(value)返回false。就好像set中不存在该对象一样。
我尝试从主程序中写出对象引用,和从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);

}
2个回答

5
第一个问题在于你的put()方法。每次插入新元素时,不应该创建一个新的HashSet。你应该先检查底层映射中是否包含提供的键,使用containsKey()方法。如果键存在,则只需添加新值。否则,创建一个新的HashSet并保留你的代码。
然后,你需要修复你的remove()方法。如果键不存在,它将引发NullPointerException异常。实际上,map.get(key)将返回nullset.remove()将失败。
编辑: 请参见@Eugen Halca的回答关于你的Multimap使用。在你的main()方法中,你正在添加PersonCollection,但尝试删除单个Person。即使使用最好的Multimap实现,也无法正常工作 ;)

谢谢你的回答。我已经修复了put()方法,并更改了我的第一篇帖子以适应这个变化。但是我不太确定你想让我如何修复remove()? - Ulbo
当您删除一个元素时,无法确定该键是否存在于您的Multimap中。因此,map.get(key)可能返回null。例如,请尝试map.remove(2, p) - Guillaume Poussel

2

您使用remove方法返回false,因为您尝试删除Person对象,但是您没有在map中找到它。 请注意,您正在向map添加Collection<Person>,但尝试删除Person,显然这两个对象不相等,因此您会得到false值。

之后:map.put(1,set); 在内存中你会看到以下数据: 1=>[[p]]; 但是,我猜您期望的结果是:1=>[p]

只需将map.put(1,set);替换为map.put(1,p);

同时,请参阅Guillaume Poussel的答案以获取正确的多重映射(MultiMap)实现建议。


不是map.remove返回false,而是set.remove()方法返回false。我不想从地图中删除整个集合,而是要从地图中的集合中删除一个人。 - Ulbo
谢谢,伙计!这帮了我很多! - Ulbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接