Java 从多重映射中删除

Java 从多重映射中删除,java,collections,multimap,Java,Collections,Multimap,在学校里,我们要实施我们自己的班级地图 当我实现remove方法时,遇到了一些麻烦 我的问题是,当我调用remove方法时,set.remove(value)返回false。就像集合不包含对象一样 我试着从main中写出对象引用,从MultiMap类写出对象引用,对象看起来是一样的 我错过了什么 提前谢谢 这是我的地图代码: public class MultiMap<K, V> { private final Map<K, Set<V>> map = ne

在学校里,我们要实施我们自己的班级地图

当我实现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);
    }
}
公共类多重映射{
私有最终映射=新HashMap();
公共多重映射(){
}
公共字符串toString(){
StringBuilder sb=新的StringBuilder();
Set keys=map.keySet();
用于(K:键){
某人附加(“钥匙”);
b.附加(k);
某人附加(“价值”);
sb.append(map.get(k));
}
使某人返回字符串();
}
公共整数大小(){
返回map.size();
}
公共布尔put(K键,V值){
集合;
if(地图容器(图例)){
set=map.get(键);
增加(价值);
}否则{
set=新的HashSet();
增加(价值);
} 
return(map.put(key,set)!=null)?false:true;
}
公共设置获取(K键){
返回map.get(key);
}
公共无效删除(K键,V值){
Set=map.get(键);
系统输出打印项次(值);
System.out.println(set.remove(value));
if(set.isEmpty()){
地图。删除(键);
}
}
主要内容:

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

}
publicstaticvoidmain(字符串[]args){
人员p=新人员(“navn”);
集合集=新的HashSet();
增加(p);
多重映射=新多重映射();
地图放置(1套);
System.out.println(map.toString());
System.out.println(map.get(1));
移除(1,p);
}

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

然后,您必须修复
remove()
方法。如果密钥不存在,它将引发
NullPointerException
。实际上,
map.get(key)
将返回
null
,并且
set.remove()
将失败


编辑:


main()中查看有关多重映射用法的信息
方法,您正在添加
Person
集合
,但尝试删除单个
Person
。即使使用最佳的
多映射
实现,也不会起作用;)

删除
返回
false
,因为您试图删除
Person
对象,但您没有它n在
地图上
。 请注意,您正在将
集合
添加到
映射
,但试图删除
个人
,显然这两个对象不相等
,因此您会得到

在:
map.put(1,set);
之后,在内存中有如下内容:
1=>[[p]];
但是,我想,你期望
1=>[p]

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


另外,请查看
Guillaume Poussel
answer以获得正确的多地图实施建议。

Thx以获取您的答案。我修复了put()方法,并将我的第一篇文章更改为适合此内容。但我不确定我是否理解您希望我如何修复remove?当您删除元素时,您无法确定多重映射中是否存在键。因此
map.get(key)
可以返回
null
。例如,请尝试
map.remove(2,p)
。返回false的不是map.remove,而是set.remove()方法。我不想从地图中删除整个集合,但我想从地图中的集合中删除一个人。多谢老兄,这帮了大忙!