Arrays.sort(Comparator)-Java 6与Java 7 import java.util.Comparator; 公共类比较器{ int i; 内部的公共静态类实现了Comparator{ @凌驾 公共整数比较(CompareTester o1、CompareTester o2){ //TODO自动生成的方法存根 系统输出打印LN(o1.i-o2.i); 返回0; }}} 公共类比较测试{ 公共静态void main(字符串[]args){ CompareTester j=新的CompareTester(); j、 i=3; CompareTester k=新的CompareTester(); k、 i=5; CompareTester l=新的CompareTester(); l、 i=7; CompareTester[]数字={j,k,l}; sort(numbers,newcompareTester.Inside()); }}
当在Java6和Java7中运行时,这两个类在CompareTester类中给出了两个不同的结果 Java7中是否为Comparator引入了任何不同类型的实现?除了a(仅与内部相关)之外,Array.sort(E,Comparator)的最终结果之间没有差异。所以,不,并没有区别“在Java7中为Comparator引入” 只需将您的实现更改为Arrays.sort(Comparator)-Java 6与Java 7 import java.util.Comparator; 公共类比较器{ int i; 内部的公共静态类实现了Comparator{ @凌驾 公共整数比较(CompareTester o1、CompareTester o2){ //TODO自动生成的方法存根 系统输出打印LN(o1.i-o2.i); 返回0; }}} 公共类比较测试{ 公共静态void main(字符串[]args){ CompareTester j=新的CompareTester(); j、 i=3; CompareTester k=新的CompareTester(); k、 i=5; CompareTester l=新的CompareTester(); l、 i=7; CompareTester[]数字={j,k,l}; sort(numbers,newcompareTester.Inside()); }},java,java-7,java-6,Java,Java 7,Java 6,当在Java6和Java7中运行时,这两个类在CompareTester类中给出了两个不同的结果 Java7中是否为Comparator引入了任何不同类型的实现?除了a(仅与内部相关)之外,Array.sort(E,Comparator)的最终结果之间没有差异。所以,不,并没有区别“在Java7中为Comparator引入” 只需将您的实现更改为 import java.util.Comparator; public class CompareTester { int i; public sta
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());
}}
这样,您就不需要使用数组进行任何特殊操作。排序:
import java.lang.Comparable;
public class CompareTester implements Comparable<CompareTester> {
int i;
public int compareTo(CompareTester o) {
return this.i - o.i;
}
}
Java7使用TimSort,Java6使用MergeSort。您的比较器总是返回0,这会破坏该值,而TimSort正在对此进行拾取
要修复代码,您确实需要解决这个问题。如果您真的想使用旧的排序算法,那么使用-Djava.util.Arrays.useLegacyMergeSort=true进行编译在比较中返回0将意味着用于此目的的对象是相同的,因此顺序取决于算法是稳定的还是不稳定的。您的比较测试仪返回的结果都是相等的。这不是一个好主意,也不是一个好测试。为什么您的比较器总是返回0
?这里我只是在考虑为什么“CompareTester”类中的“compare”方法对Java 6和Java 7使用两个不同的参数(o1和o2)。感谢您的回答。这里不同的排序算法是不相关的,因为我只是使用整数。但在实际的应用程序代码中,我使用的是对象,我必须重写compare方法来比较这些对象。这导致了一个问题。如果您正在比较两个对象
s,如obj1==obj2
,请查看;您应该重写.equals
和.hashCode
。对于排序,然后实现Compariable
接口是正确的方法。
import java.lang.Comparable;
public class CompareTester implements Comparable<CompareTester> {
int i;
public int compareTo(CompareTester o) {
return this.i - o.i;
}
}
Arrays.sort(numbers);