最近刷的一些题目里,经常有对数组进行排序,使用Arrays.sort(),但是不免需要自己定义一些排序方式。
下图中的排序是Java内置类中自定义的排序方式。
String类内部重写了Comparable接口中的compareTo,所以有了排序功能。引用类型,都不具有直接的比较功能,因为程序不知道以什么规则比较,例如一个Person类,如果我们单纯的以说要排序,那么人的好几个维度:升高,体重等等,这些都可以成为排序的维度,所以引用类型需要自定义一种方式来进行排序。比如就以身高排序,或者体重等等。
Java中的有两个对象的比较方式,一个是Compareable接口,一个是Comparator
Comparable
- 重写Compareable中的compareTo即可达到效果
class Person6 implements Comparable{
int age;//年龄
int height;//身高
public Person6(int age, int height) {
this.age = age;
this.height = height;
}
@Override
public int compareTo(Object o) {
return this.age - ((Person6)o).age;//根据年龄排序
//排序的方式是,当前对象的age>o.age,那么当前对象就在o的后面
//如果想反着来,写成-(this.age - ((Person6)o).age)就好
}
@Override
public String toString() {
return "Person6{" +
"age=" + age +
", height=" + height +
'}';
}
}
public class blog0430 {
public static void main(String[] args) {
Person6 p1 = new Person6(17,170);
Person6 p2 = new Person6(13,160);
Person6 p3 = new Person6(11,180);
Person6[] arr = new Person6[3];
arr[0] = p1;
arr[1] = p2;
arr[2] = p3;
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
Comparator
Arrays类中的sort方法中提供了一种重载的方式,我们可以传入特定的比较器进行比较
- 重写compare方法即可
public static void main(String[] args) {
Person6 p1 = new Person6(17,170);
Person6 p2 = new Person6(13,160);
Person6 p3 = new Person6(11,180);
Person6[] arr = new Person6[3];
arr[0] = p1;
arr[1] = p2;
arr[2] = p3;
Arrays.sort(arr, new Comparator<Person6>() {
@Override
public int compare(Person6 o1, Person6 o2) {
//根据身高正序排列
return o1.height - o2.height;
}
});
System.out.println(Arrays.toString(arr));
}
compare的参数就是比较的两个对象。然后通过获取两个对象的属性来比较即可
下面是刷题遇到的
当然了还可以使用java8新特性:lambda表达式
Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
十分简洁,感觉就是js箭头函数,没什么区别,但是做题的时候确实没想到这