我有一个相对高级的字符串比较器和一个包含大量字符串(大约100个字符串,已经尝试过缩减但问题无法重现)的列表。当我尝试使用Java 7进行排序时,会产生上述错误。我猜测规则
if a < b and b < c then a < c
可能会违反合同。如何找到一个违反合同的样本?
我有一个相对高级的字符串比较器和一个包含大量字符串(大约100个字符串,已经尝试过缩减但问题无法重现)的列表。当我尝试使用Java 7进行排序时,会产生上述错误。我猜测规则
if a < b and b < c then a < c
可能会违反合同。如何找到一个违反合同的样本?
好的,我用蛮力解决了它: 3个嵌套循环来比较3个值并验证上述规则。现在找到了一个违反该规则的示例。
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);
}
}
}
}
我以前经常使用这种方法,特别是当你无法通过检查找到代码中的逻辑错误时。
我还在另一篇帖子上找到了这个答案,其中有一个通用类可以使用。