从 multiMap 中删除

Ulb*_*lbo 3 java collections multimap

在学校,我们要实现我们自己的类 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

主要的:

    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);

}
Run Code Online (Sandbox Code Playgroud)

Gui*_*sel 5

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

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


编辑:

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