今天在项目里使用 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方法的注解为

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