从multiMap中删除

时间:2013-11-04 15:58:42

标签: java collections multimap

在学校我们要实现自己的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);

}

2 个答案:

答案 0 :(得分:4)

第一个问题出在您的put()方法中。每次插入新元素时都不应创建新的HashSet。 您应首先使用containsKey()检查基础地图是否包含提供的密钥。如果密钥存在,只需添加新值。否则,请创建一个新的HashSet并保留您的代码。

然后,您必须修复remove()方法。如果密钥不存在,它将引发NullPointerException。实际上,map.get(key)将返回nullset.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实施建议。