我有一个自己的、相对复杂的字符串比较器和一大串字符串(约 100 个字符串,已经尝试减少但问题不可重现),在尝试使用 Java 7 进行排序时,对它们进行排序会产生上述错误。我猜,规则
if a < b and b < c then a < c
可能会被违反。找出违反合同的样品的最佳方法是什么?
好的,我用蛮力方式做到了:3 个嵌套循环来相互比较 3 个值并验证上述规则。现在找到了违反规则的样本。
在您的 compare() 方法和 equals() / hashcode() 方法的开头添加调试消息(您正在覆盖它们吗?)
当面对类似的问题时,深入研究问题并找到违反一般合同的 A、b 和 c 的唯一方法是使用循环。
假设您有一个list
需要排序的自定义项和一个comparator
违反其合同的自定义项,您可以使用以下内容找到对象
for (int i = 0; i < list.size(); i ++) {
for (int j = 0; j < list.size(); j ++) {
for (int k = 0; k < list.size(); k ++) {
Objects a = list.get(i);
Objects b = list.get(j);
Objects c = list.get(k);
if (comparator.compare(a, b) < 0
&& comparator.compare(b, c) < 0
&& comparator.compare(a, c) > 0) {
System.out.print(("Error...1");
System.out.print((a + ", " + i);
System.out.print((b + ", " + j);
System.out.print((c + ", " + k);
}
if (comparator.compare(a, b) > 0
&& comparator.compare(b, c) > 0
&& comparator.compare(a, c) < 0) {
System.out.print(("Error...2");
System.out.print((a + ", " + i);
System.out.print((b + ", " + j);
System.out.print((c + ", " + k);
}
if (comparator.compare(a, b) == 0
&& comparator.compare(b, c) == 0
&& comparator.compare(a, c) != 0) {
System.out.print(("Error...3");
System.out.print((a + ", " + i);
System.out.print((b + ", " + j);
System.out.print((c + ", " + k);
}
}
}
}
这种方法我以前用过很多次,尤其是当你无法通过检查发现编码中的逻辑错误时。
我还在另一篇文章中找到了这个答案,该文章有一个你可以使用的普通类