3

在学校里,我们要实现我们自己的 MultiMap 类。

当我实现 remove 方法时,我遇到了一些麻烦。

我的问题是当我调用 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);

}
4

2 回答 2

5

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

然后,您将不得不修复您的remove()方法。NullPointerException如果密钥不存在,它将引发 a 。确实,map.get(key)会回来nullset.remove()也会失败。


编辑:

有关您的 Multimap 使用情况,请参阅@Eugen Halca 的回答。在您的main()方法中,您正在添加一个Collectionof Person,但试图删除一个Person. 即使有最好的Multimap实施,那也行不通;)

于 2013-11-04T16:04:18.607 回答
2

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-04T16:15:43.617 回答