java - TreeSet 包含/删除不起作用?

标签 java contains comparable treeset

<分区>

我将 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,不是吗?

最佳答案

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

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

Note: Great care must be exercised if mutable objects are used as set elements. The behavior of a set is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is an element in the set.

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

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

关于java - TreeSet 包含/删除不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29451941/

相关文章:

java - 在java中创建类的实例时遇到问题

java - 检查 ArrayList 中是否存在值

Android:使用 contains 提取 wifi 功能

java - CompareTo 的通用比较类型

java - 将输出从大到小排序?

java - 为什么 JTable 表头没有出现在图像中?

java - 如何显示目录的内容

excel - 如何检查单元格是否仅包含特定列表中的字符?

java - 如何有效地比较集合?

java - 为什么在 Java 中将 String 解析为 Date 很慢?我们可以加速吗?