我正在尝试用 java 编写一些数学代码。我想做的是将分圆陪集 放入 TreeSet。陪集有一个索引和一组整数。如果一个陪集具有相同的元素,则陪集等于另一个陪集。如果集合不同,则陪集按其索引排序。
例如:
C1 = [1, 2, 4, 8]
C3 = [3, 6, 9, 12]
C9 = [3, 6, 9, 12]
C1 is less than C3
C3 is equal to C9
足够好的数学。我选择将陪集放入 TreeSet,因为我不需要重复的元素,而且我需要让它们按索引排序。
问题是即使 TreeSet.contains() 返回 false,我仍然可以在使用 compareTo() 和 equals() 方法时在 TreeSet 中找到一个相等的元素。
这是程序的实际打印输出:
cosets = [C0, C1, C3, C5, C7]
cosets.contains(C9) = false
C0.compareTo(C9) = -1, C0.equals(C9) = false
C1.compareTo(C9) = -1, C1.equals(C9) = false
C3.compareTo(C9) = 0, C3.equals(C9) = true
C5.compareTo(C9) = -1, C5.equals(C9) = false
C7.compareTo(C9) = -1, C7.equals(C9) = false
我附上下面的代码。我不想让代码更简单,因为我发现它有一些魔力。如果您在代码中将 MAGIC_INDEX 值更改为 7 或更小,它就会开始工作。对我来说,这似乎是一个 JVM 错误。
有什么建议吗?
最佳答案
正如我常说的,如果您的程序中有错误,请使用调试器。这很快向我展示了您的问题。
TreeSet 是一个二叉树。搜索时,它会根据您要查找的元素是在它正在检查的元素之前还是之后(或相同)向下导航树。如果您将以下内容添加到您的 compareTo()
System.out.println("Comparing, "+this+" to "+c);
它会打印出来
Comparing, C9 to C1
Comparing, C9 to C5
Comparing, C9 to C7
问题是 C9 在它不匹配的每个元素之后。因此,当它到达树上的 C5 时,您的 compareTo 表示它在它之后,而实际上它需要查看之前(到达 C3)并且搜索沿着错误的树路径进行。
关于Java TreeSet contains() 给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4312653/