【发布时间】:2014-04-28 07:56:18
【问题描述】:
基本上我有两个比较器(Comparator1 和 Comparator2),它们的实现略有不同。两者都应按行名称长度的降序对列表进行排序。
Comparator2 似乎不适用于 java7/java8。 Comparator1 始终有效。 两者都适用于 java 1.6 实现,或者如果我设置 -Djava.util.Arrays.useLegacyMergeSort=true。 如果 Comparator2 中存在问题,java 应该抛出 IllegalArgumentException,但不会抛出异常。
这在 java 文档中被描述为 “java.util.Arrays.sort 和(间接)java.util.Collections.sort 使用的排序算法已被替换。新的排序实现如果检测到违反 Comparable 合同的 Comparable 可能会抛出 IllegalArgumentException”
这是 JRE 中的错误还是 Comparator2 有问题?
public class Main {
public static void main(String[] args) {
Row row1 = new Row("AAAA");
Row row2 = new Row("BBB");
Row row3 = new Row("CC");
Row row4 = new Row("D");
List<Row> list1 = new ArrayList<Row>();
list1.add(row2);
list1.add(row3);
list1.add(row1);
list1.add(row4);
System.out.println("Before sorting:");
System.out.println("");
print(list1);
Collections.sort(list1, new Comparator2());
System.out.println("After sorting with comparator2:");
System.out.println("");
print(list1);
Collections.sort(list1, new Comparator1());
System.out.println("After sorting with comparator1:");
System.out.println("");
print(list1);
}
private static void print(List<Row> list) {
for (Row row : list) {
System.out.println(row.name);
}
}
}
public class Row {
String name;
public Row(String name) {
this.name = name;
}
public int getLength() {
return name.length();
}
}
public class Comparator1 implements Comparator<Row> {
@Override
public int compare(Row o1, Row o2) {
Integer length1 = o1.getLength();
Integer length2 = o2.getLength();
return -1 * length1.compareTo(length2);
}
}
public class Comparator2 implements Comparator<Row> {
@Override
public int compare(Row o1, Row o2) {
int length1 = o1.getLength();
int length2 = o2.getLength();
if (length1 < length2) {
return 1;
} else if (length2 > length1) {
return -1;
} else {
return 0;
}
}
}
【问题讨论】:
-
听起来
x.compare(y)和y.compare(x)可能不一致-您可以发布比较器的代码吗? -
你忘了告诉什么不工作或什么是错的。
标签: java sorting java-7 java-8