小编C. *_*nig的帖子

ArrayList.sort()中的IllegalArgumentException - 方法

我有以下异常,我不太清楚为什么:

java.lang.IllegalArgumentException:比较方法违反了它的一般合同!

在java.util.TimSort.mergeLo(TimSort.java:777)java.util.TimSort.mergeAt(TimSort.java:514)java.util.TimSort.mergeCollapse(TimSort.java:441)java.util. TimSort.sort(TimSort.java:245)java.util.Arrays.sort(Arrays.java:1512)at java.util.ArrayList.sort(ArrayList.java:1454)

我编写了以下JUnit测试来验证行为:

@Test
public void testComparator() {
    List<Boolean> item = new ArrayList<>();

    item.add(true);
    for (int i = 0; i < 1000000; i++) {
        item.add(false);
    }

    while(true) {
        System.out.println("Sorting");
        Collections.shuffle(item);

        item.sort((lineItem1, lineItem2) -> {
            if (lineItem1 && lineItem2) {
                return 0;
            } else if (!lineItem1) {
                return 1; 
            } else if (!lineItem2 ) {
                return -1;
            } 

            return 0;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我交换返回1并返回-1,它会突然无效.但为什么?这应该只改变排序顺序而不是破坏整个比较器.

我错过了什么?

java comparator java-8

3
推荐指数
1
解决办法
380
查看次数

标签 统计

comparator ×1

java ×1

java-8 ×1