首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从multiMap中去除

从multiMap中去除
EN

Stack Overflow用户
提问于 2013-11-04 15:58:41
回答 2查看 3.7K关注 0票数 3

在学校里,我们要实施我们自己的班级MultiMap。

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

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

我尝试从main中写出对象reference,从MultiMap类写出对象引用,而对象似乎是相同的。

我在这里错过了什么?

提前感谢

这是我的地图代码:

代码语言:javascript
运行
复制
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);
    }
}

Main:

代码语言:javascript
运行
复制
    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);

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-04 16:15:43

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实现建议。

票数 2
EN

Stack Overflow用户

发布于 2013-11-04 16:04:18

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

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

编辑:

关于您的多用户应用,请参见@Eugen Halca answer。在main()方法中,您正在添加Collection of Person,但试图删除单个Person。即使使用最好的Multimap实现,这也是行不通的;)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19771728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档