return o1 - o2; // 默认第一个比第二个大,就 返回正数,正数,这个Comparator比较器接口就会升序排序,
return o2 - o1; // 第二个比第一个大,返回负数, 这个Comparator比较器接口就会降序排序,原型:-(o1-o2)
package com.itheima.d7_arrays;
import java.util.Arrays;
import java.util.Comparator;
public class ArrayDemo2 {
public static void main(String[] args) {
// 目标:自定义数组的排序规则:Comparator比较器对象
// 1. Arrays的sort方法对于有值特性的数组是默认升序排序
int[] ages = {34, 12, 42, 23};
Arrays.sort(ages);
System.out.println(Arrays.toString(ages));
// 2. 需求:降价排序!(自定义比较器对象,只能支持引用类型的排序!)int[] 数组是引用类型,元素是基本数据类型,所以用Integer
Integer[] ages1 = {34, 12, 42, 23};
/**
* 参数一:被排序的数组,必须是引用类型的元素
* 参数二:匿名内部类对象,代表了一个比较器对象
*/
Arrays.sort(ages1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 在这里指定比较规则
// if (o1 > o2){
// return 1; // 这里的 1 没有实际意义,相当于信号一样 这个信号只要是正数就行
// }else if (o1 <o2){
// return -1; // -1没有实际意义就是个信号 // 这个信号只要是负数就行
// }
// return 0; // 认为两个相等返回0
// 也可以这样一步到位:
// return o1 - o2; // 默认 如果第一个比第二个大,就 返回正数,正数,这个Comparator比较器接口就会升序排序,
return o2 - o1; // 第二个比第一个大,返回负数, 这个Comparator比较器接口就会降序排序,原型:-(o1-o2)
}
});
System.out.println(Arrays.toString(ages1));
System.out.println("=========================");
Student[] students = new Student[3]; // 创建一个存放引用类型的数组对象(所以用Student[]),存储的是Student类的对象,存储的数量为 3
students[0] = new Student("吴磊",23,180);
students[1] = new Student("吴1",24,181);
students[2] = new Student("吴2",25,182);
System.out.println(Arrays.toString(students)); // 打印的是这数组存放,三个对象的地址,没有重写toString方法
// 排序
// Arrays.sort(students); // 运行会直接报错,他不知道怎么排,没有条件
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 在这里重写排序规则
// return o1.getAge() - o2.getAge(); // 根据年龄进行升序排序 默认第一个减第二个返回正数
// return o2.getAge() - o1.getAge(); // 根据年龄进行降序排序
// 也可以按照身高进行降序排序 因为身高会有小数,而compare方法的返回值是int,所以身高不能直接相减
return Double.compare(o2.getHeight(),o1.getHeight()); // 降序将o1和o2倒过来
}
});
System.out.println(Arrays.toString(students)); //[Student{name='吴2', age=25, height=182.0}, Student{name='吴1', age=24, height=181.0}, Student{name='吴磊', age=23, height=180.0}]
}
}