dvi*_*vim 1 java contains treeset
我正在尝试用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
Run Code Online (Sandbox Code Playgroud)
足够好的数学。我选择将陪集放入 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
Run Code Online (Sandbox Code Playgroud)
我附上下面的代码。我不想让代码变得更简单,因为我发现它有一些魔力。如果你改变在代码中将MAGIC_INDEX值更改为 7 或更少,它就会开始工作。对我来说这似乎是一个 JVM 错误。
有什么建议么?
你的方法compareTo()
和equals()
方法不一致,因此TreeSet
无法正确使用它们。
来自API 文档:
请注意,如果要正确实现 Set 接口,集合维护的顺序(无论是否提供显式比较器)必须与 equals 一致。(有关与 equals 一致的精确定义,请参阅 Comparable 或 Comparator。)这是因为 Set 接口是根据 equals 操作定义的,但 TreeSet 实例使用其compareTo(或compare)方法执行所有元素比较,因此两个从集合的角度来看,被此方法视为相等的元素是相等的。即使集合的顺序与 equals 不一致,集合的行为也是明确定义的;它只是没有遵守 Set 接口的一般契约。