实现对象数组的排序有两种方式,让对象继承Comparable接口或者重写Arrays.sort(T[] a, Comparator<? super T> c)中的Comparator方法
继承Comparable接口
继承接口是为了保证继承该接口的类会有CompareTo方法
当调用x.compareTo(y)时,比较的是x和y的内容,若x的内容小于y的内容,返回一个负数,若等于就返回零,若大于就返回一个整数
所以,我个人感觉,在compareTo方法中不一定需要再调用compare去进行比较,可以直接通过x和y内容相减(至于选择x内容减y内容还是y内容减x内容,需要根据想要升序还是降序来决定)
但是有一点需要注意,如果比较的内容是小数,那么需要调用Double.compare(),而不能直接相减
详解见Java核心技术卷1,P229接口的概念
package comapreTest;
import java.util.Arrays;
import java.util.Comparator;
public class Demo11 {
public static void main(String[] args) {
Employ a = new Employ(100);
Employ b = new Employ(101);
Employ c = new Employ(102);
Employ[] arr = new Employ[]{a, b, c};
Arrays.sort(arr);
for (Employ e : arr) {
System.out.println(e.getSalary());
}
}
}
class Employ implements Comparable {
private int salary;
public Employ(int salary){
this.salary = salary;
}
public int getSalary() {
return salary;
}
@Override
public int compareTo(Object other) {
Employ e = (Employ) other;
// return Double.compare(salary, e.salary);
// return salary - e.salary;
return e.salary - salary;
}
}
重写Arrays.sort(T[] a, Comparator<? super T> c)中的Comparator
我在LeetCode做题的时候用的就是这种方法,只不过当时不理解
是通过匿名类实现一个接口
package comapreTest;
import java.util.Arrays;
import java.util.Comparator;
public class Demo12 {
public static void main(String[] args) {
Employ2 d = new Employ2(200);
Employ2 e = new Employ2(201);
Employ2 f = new Employ2(202);
Employ2[] arr2 = new Employ2[]{d, e, f};
Arrays.sort(arr2, new Comparator<Employ2>() {
@Override
public int compare(Employ2 o1, Employ2 o2) {
// return o1.getSalary() - o2.getSalary();
return o2.getSalary() - o1.getSalary();
}
});
for (Employ2 e2 : arr2) {
System.out.println(e2.getSalary());
}
}
}
class Employ2 {
private int salary;
public Employ2(int salary){
this.salary = salary;
}
public int getSalary() {
return salary;
}
}