解决java.lang.IllegalArgumentException: Comparison method violates its general contract

今天在项目里使用 Collections.sort 方法是报错了

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeHi(TimSort.java:899)
    at java.util.TimSort.mergeAt(TimSort.java:516)
    at java.util.TimSort.mergeForceCollapse(TimSort.java:457)
    at java.util.TimSort.sort(TimSort.java:254)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1456)
    at java.util.Collections.sort(Collections.java:175)
    at milo.com.javatest.JavaMainClass.main(JavaMainClass.java:59)

我的修改方案如下

public class JavaMainClass {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Y");
        list.add("F");
        list.add("L");
        list.add("Y");
        list.add("J");
        list.add("H");
        list.add("W");
        list.add("Q");
        list.add(null);
        list.add("S");
        list.add("G");
        list.add(null);
        list.add("L");
        list.add("H");
        list.add("Q");
        list.add("W");
        list.add("Y");
        list.add("X");
        list.add("M");
        list.add("Z");
        list.add("L");
        list.add("Z");
        list.add("Z");
        list.add("H");
        list.add("Y");
        list.add("X");
        list.add("Q");
        list.add("W");
        list.add("J");
        list.add("D");
        list.add("J");
        list.add("L");
        list.add("L");

        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
//                危险写法,有安全隐患
//                if (o1 == null || o2 == null) {
//                    return 0;
//                }

//                稳妥写法
                if (o1 == null && o2 == null) {
                    return 0;
                }

                if (o1 == null) {
                    return 1;
                }

                if (o2 == null) {
                    return -1;
                }

                if (!o1.matches("^[A-Za-z]+$")) {
                    if (!o2.matches("^[A-Za-z]+$")) {
                        return 0;
                    } else {
                        return 1;
                    }
                } else {
                    if (!o2.matches("^[A-Za-z]+$")) {
                        return -1;
                    } else {
                        return o1.compareTo(o2);
                    }
                }
            }
        });


        for (String s : list) {
            System.out.print(s + ",");
        }

    }
}

java对compareTo方法的注解为

问题

虽然有了官方文档的帮助,问题也得到了解决,但我仍然不是很明白为什么这个异常就出现了,希望有大神看到此贴能给小弟指点一二。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容