当前位置: 首页 > 知识库问答 >
问题:

调试”比较法违反了其通用契约!”

浦墨竹
2023-03-14

我有一个自己的,相对复杂的字符串比较器和一个庞大的字符串列表(~100个字符串,已经尝试减少,但问题不可重现),其中对它们进行排序会产生上述错误尝试使用Java 7排序。我想,规则

if a < b and b < c then a < c

可能会被侵犯。找出违反合同的样品的最好方法是什么?

共有3个答案

鲜于勇
2023-03-14

当面对一个类似的问题时,深入问题并找到违反一般契约的A、b和c的集合的唯一方法是使用循环。

假设您有一个需要排序的list和一个违反其契约的自定义比较器,您可以使用如下内容找到对象

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);

                        }
                            
                    }
                }
            }

我以前多次使用过这种方法,尤其是当您无法通过检查发现编码中的逻辑错误时。

我还在另一个帖子上找到了这个答案,这个帖子有一个你可以使用的通用类

https://stackoverflow.com/a/35000727/4019094

张博涛
2023-03-14

在compare()方法的开头和equals() / hashcode()方法中添加调试消息(您正在覆盖它们,对吗?)

洪华皓
2023-03-14

好的,我用蛮力方式做到了:3个嵌套循环来相互比较3个值并验证上述规则。现在找到了违反规则的示例。

 类似资料:
  • 有人能解释一下为什么我下面的比较器有时候会抛出上面的异常吗? 注意:myObject 中的 id 字段类型为 long。 解决方案: 基于@amit的回答

  • 我发现了许多与此标题相关的重复问题,但没有一个与我的问题有关,因为我的问题无法通过崩溃追踪。我不断收到有关此标题的许多不同的崩溃。 检查此示例(仅在android 4上发生): 我通过研究发现,这种情况发生在比较/排序时,而忽略了某个条件。同时,在我的代码中,我没有使用文档/示例中提到的比较或排序方法。 非常感谢任何建议。

  • 我知道很多答案已经回答了我的问题。在我的代码中,异常说“比较方法违反了它的一般合同”,但我不知道我的比较方法如何违反了它的一般合同。这是我的代码:

  • 我正在根据下面的比较器对集合进行排序。 这些值总是非空的。getOrderSendTime()对象属于java.util.Date类。 我知道这是一种传递性不一致,我认为这样的类不会有这样的问题。我搜索了未解决的问题,但没有找到有关该主题的任何问题。 有什么想法吗?

  • 我已经检查了以前关于这个话题的帖子-这个和这个。尽管如此,我还是想不出在我下面给出的代码中违反合同的情况是如何发生的。 我使用它的方式如下: iterTypeScoreMap声明如下 映射(iterTypeScoreMap)在排序过程中可能会改变,这就是为什么我复制了一份列表,然后对它调用sort。 既然我使用的是Double的内置compareTo方法,那么这不应该考虑合同吗?另一件让调试变得困

  • 我知道它已经被询问和回答了数百万次,但我仍然无法弄清楚为什么我在排序期间收到了违规。这是我的代码: 我收到了这个错误 有什么想法吗?