java - 从 multiMap 移除

标签 java collections multimap

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

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

我的问题是当我调用 remove 方法时,set.Remove(value) 返回 false。就像集合不包含对象一样。

我尝试写出来自 main 的对象引用和来自 MultiMap 类的对象引用,对象似乎是相同的。

我在这里错过了什么?

提前致谢

这是我的 map 代码:

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

}

最佳答案

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

然后,您将不得不修复您的remove() 方法。如果 key 不存在,它将引发 NullPointerException。实际上,map.get(key) 将返回 nullset.remove() 将失败。


编辑:

参见 @Eugen Halca answer关于您的 Multimap 使用情况。在您的 main() 方法中,您正在添加 PersonCollection,但试图删除单个 Person .即使使用最好的 Multimap 实现,那也行不通 ;)

关于java - 从 multiMap 移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19771728/

相关文章:

java - Alfresco: checkin 在之前某个时间点 checkout 的文档(并且悬而未决)

java - 抛出新的 NullPointerException VS 在 null 对象上调用方法

java - 更改 spring batch 中的默认数据源

java - Collections.sort 创建重复项?

java - Multimap Java 的 Multimap - 时间表分类

java - Spring 安全 i18n : wrong error message resolved

.net - .Net 集合类是否对包含的成员使用 .Equals() 来计算 .Contains()?

java - 在java 8中首先对整数列表进行排序,然后按可被10整除进行排序

java - Spring MVC配置+Jackson+Guava multimap

java - Bukkit - 为什么我的 Multimap 没有被通过?