比较方法违反了其总契约,经过长时间的比较

时间:2013-05-06 14:53:12

标签: comparison long-integer contract

Collections.sort(cells, new Comparator<MyCell>() {

        @Override
        public int compare(MyCell o1, MyCell o2) {
            if (o1.getX() <= o2.getX() && o1.getY() <= o2.getY()) {
                return -1;
            } else {
                return 1;
            }
        }

    });

这里是完整的堆栈跟踪:

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(Unknown Source)
at java.util.TimSort.mergeAt(Unknown Source)
at java.util.TimSort.mergeCollapse(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)

我知道有很多像这样的问题,但我不知道为什么我的比较是错误的。 getX()和getY()返回一个long。那么我该如何解决这个问题?

我已经搜索过了,但没有得到答案。

提前致谢。

1 个答案:

答案 0 :(得分:0)

这是关于该主题的好answer。比较器必须是可传递的才能工作。否则,您将无法从初始项目的不同排序中获得相同的结果。