首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java ()给出了假结果

Java ()给出了假结果
EN

Stack Overflow用户
提问于 2010-11-30 10:28:09
回答 3查看 4.3K关注 0票数 1

我正在尝试用java编写一点数学代码。我想要做的是,把摆线彗星放到TreeSet上。一个陪集有一个索引和一组整数。如果集合具有相同的元素,则陪集等于其他陪集。如果集合不同,则陪集按其索引排序。

例如:

代码语言:javascript
运行
复制
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,我仍然可以在TreeSet中找到一个元素,它在使用compareTo()和compareTo()方法时是相等的。

这是程序的实际打印结果:

代码语言:javascript
运行
复制
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错误。

http://2m.lt/files/Main.java

http://2m.lt/files/Coset.java

有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-30 11:02:41

正如我经常说的,如果程序中有错误,请使用调试器。这很快就向我表明了你的问题。

TreeSet是一棵二叉树。在搜索时,它将根据您要查找的元素是在元素之前还是之后(或与它正在检查的元素相同)向下导航。如果在您的compareTo()中添加以下内容

代码语言:javascript
运行
复制
System.out.println("Comparing, "+this+" to "+c);

它会打印出来

代码语言:javascript
运行
复制
Comparing, C9 to C1
Comparing, C9 to C5
Comparing, C9 to C7

问题是,C9是在它不匹配的每个元素之后。因此,当它到达树上的C5时,您的compareTo表示它在后面,当它实际上需要在(到达C3)之前查找时,搜索沿着树的错误路径进行。

票数 4
EN

Stack Overflow用户

发布于 2010-11-30 10:35:35

您的compareTo()equals()方法不一致,因此TreeSet无法正确地使用它们。

来自API文档

请注意,如果要正确实现set接口,则由Set维护的排序(无论是否提供显式比较器)必须与equals一致。(与平等一致的精确定义见可比或比较器)。这是因为set接口是按照等于操作定义的,但是TreeSet实例使用它的compareTo (或compare)方法执行所有元素比较,因此从Set的角度来看,这个方法认为相等的两个元素是相等的。一个集合的行为是明确的,即使它的顺序与相等不一致;它只是没有遵守set接口的一般契约。

票数 4
EN

Stack Overflow用户

发布于 2010-11-30 10:39:26

您的Comparable实现在Coset中没有提供全面排序。

看起来您应该在value TreeSet上定义一个订单。无论是在检查index之前还是之后。

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

https://stackoverflow.com/questions/4312653

复制
相关文章

相似问题

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