import java.util.Comparator;
public class CompareTester {
int i;
public static class Inside implements Comparator<CompareTester> {
@Override
public int compare(CompareTester o1, CompareTester o2) {
// TODO Auto-generated method stub
System.out.println(o1.i - o2.i);
return 0;
}}}
public class CompareTest {
public static void main(String[] args) {
CompareTester j = new CompareTester();
j.i = 3;
CompareTester k = new CompareTester();
k.i = 5;
CompareTester l = new CompareTester();
l.i = 7;
CompareTester[] numbers = { j, k, l };
Arrays.sort(numbers, new CompareTester.Inside());
}}
在Java 6和Java 7中运行时,这两个类在CompareTester类中提供两个不同的结果。
Java7 for Comparator中是否引入了任何不同类型的实现?
答案 0 :(得分:4)
Java 7使用TimSort,Java 6使用MergeSort。你的比较器总是返回0,这会打破Comparable Contract并且TimSort正在接受它。
要修复您真正需要解决的代码。如果您确实想使用旧的排序算法,请使用-Djava.util.Arrays.useLegacyMergeSort=true
答案 1 :(得分:3)
除different sorting algorithm之外,Array.sort(E, Comparator)
仅在内部相关,import java.util.Comparator;
public class CompareTester {
int i;
public static class Inside implements Comparator<CompareTester> {
@Override
public int compare(CompareTester o1, CompareTester o2) {
return o1.i - o2.i;
}
}
}
的最终结果之间没有区别。所以,不,“Java7 for Comparator”中没有引入差异。
只需将您的实施更改为
即可Comparator
并且比较最终得到的数组,你会发现Java 6和7之间没有区别。
如果您想避免使用CompareTester
,请改为使用import java.lang.Comparable;
public class CompareTester implements Comparable<CompareTester> {
int i;
public int compareTo(CompareTester o) {
return this.i - o.i;
}
}
类实现Comparable<T>
(Java 7 doc here);
Array.sort
然后,Arrays.sort(numbers);
:
{{1}}