【问题标题】:TreeSet contains/remove not working? [closed]TreeSet 包含/删除不起作用? [关闭]
【发布时间】:2015-06-09 17:01:47
【问题描述】:

我将 Node 对象保存在 TreeSet 中:

public TreeSet<Node> viewNodes = new TreeSet<Node>();

节点如下所示:

public class Node implements Comparable<Node>{
    private long nodeID;
    ...
    public long getID() {
        return nodeID;
    }

    @Override
    public int compareTo(Node n) {
        System.out.println("comparing: " +this + " with " + n + " -- " + new Long(nodeID).compareTo(n.getID()));
        return new Long(nodeID).compareTo(n.getID());
    }

    @Override
    public boolean equals(Object o){
        if(o instanceof Node){
            System.out.println((compareTo((Node)o) == 0));
            return compareTo((Node)o) == 0;
        }
        return false;
    }

    @Override
    public int hashCode(){
        return new Long(nodeID).hashCode();
    }
}

但是,当我尝试删除节点时,它们并没有被删除,并且 TreeSet 认为它们不在集合中!!

删除代码:

    System.out.println("removing " + node);
    System.out.println("viewNodes: " + viewNodes);
    System.out.println("contains node?: " + viewNodes.contains(node));
    viewNodes.remove(node);
    System.out.println("now viewNodes looks like: " +viewNodes);

输出:

removing 5
viewNodes: [5, 4, 3, 2, 1]
comparing: 5 with 2 -- 1
comparing: 5 with 1 -- 1
contains node?: false
comparing: 5 with 2 -- 1
comparing: 5 with 1 -- 1
now viewNodes looks like: [5, 4, 3, 2, 1]

这是为什么?我已经实现了 Comparable,不应该是这样吗?

【问题讨论】:

  • 请展示一个小程序来说明问题。它对我有用。
  • 检查删除操作的结果。另请参阅 contains() 在预期删除后所说的内容。并且您确认 node 已插入容器?注意到您的输出表明该节点不包含,这可能解释了您所看到的结果。
  • 在将 ID 插入 TreeSet 后,我​​正在更改它的值!现在可以了,谢谢安迪!

标签: java contains comparable treeset


【解决方案1】:

正如安迪建议的那样,我在将 ID 插入 TreeSet 后更改了它的值。我想这会导致节点排序不正确。

现在可以了,谢谢!

【讨论】:

  • 作为答案发布。
【解决方案2】:

正如 Andy 发现的那样,您的问题是您在插入后更改了元素的 ID。

使用任何类型的 Set 时,应注意不要更改 Set 中的元素。来自Set interface documentation

注意:如果将可变对象用作集合元素,则必须非常小心。如果对象的值以影响等于比较的方式更改,而对象是集合中的一个元素,则不指定集合的​​行为。

同样的事情也适用于 Map 键,您会在 Map interface documentation 中找到等效的语句。

在 TreeSet(及其使用的底层 TreeMap)中,compareTo 方法的结果用于放置元素,然后再查找元素。如果compareTo 的结果在插入和查找之间发生了变化,它可能无法正常工作。

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多