Java 中 Comparable 与 Comparator 的使用
package org.example;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.Comparator;
public class CompareTest {
/**
* 自然排序:comparable
* 实现步骤:
* ① 具体的类A实现Comparable接口
* ② 重写Comparable接口中的compareTo(Object obj)方法,在此方法中指明比较类A的对象的大小的标准
* ③ 创建类A的多个实例,进行大小的比较或排序。
*/
@Test
public void testComparable() {
// 想要使用comparable自然排序,需要实现comparable接口,可查阅String源码
String[] arr1 = new String[]{"a", "b", "c"};
String[] arr2 = new String[]{"c", "b", "a"};
Arrays.sort(arr2);
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
Student[] students = new Student[2];
students[0] = new Student("Student1",1);
students[1] = new Student("Student2",0);
Arrays.sort(students);
System.out.println(students[0].compareTo(students[1]));// -1
for (int i = 0; i < students.length; i++) {
System.out.println(students[i]);
}
}
/**
* 定制排序
* 场景:
* - 当不方便实现Comparable接口时
* - 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码(例如:一些第三方的类,你只有.class文件,没有源文件)
* - 如果一个类,实现了Comparable接口,也指定了两个对象的比较大小的规则,
* 但是此时此刻我不想按照它预定义的方法比较大小,但是我又不能随意修改,因为会影响其他地方的使用
* 实现步骤:
* ① 创建一个实现了Comparator接口的实现类A
* ② 实现类A要求重写Comparator接口中的抽象方法compare(0bject o1,0bject o2),在此方法中指明要比较大小的对象的大小关系。(比如,string类、Product类)
* ③ 创建此实现类A的对象,并将此对象传入到相关方法的参数位置即可。比如:Arrays.sort(..,类A的实例)
*/
@Test
public void testComparator() {
Student[] students = new Student[2];
students[0] = new Student("Student1",1);
students[1] = new Student("Student2",0);
// 1.创建一个Comparator接口的带泛型的实现对象
Comparator<Student> comparator = new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
}
};
// 排序
Arrays.sort(students, comparator);
//2.创建Object类型的Comparator实现对象
Comparator comparator1 = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Student && o2 instanceof Student){
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return s1.age - s2.age;
}
throw new RuntimeException("类型不匹配");
}
};
// 排序
Arrays.sort(students, comparator1);
// for (int i = 0; i < students.length; i++) {
// System.out.println(students[i]);
// }
}
}
class Student implements Comparable{
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 在此方法中指明如何判断当前类的对象大小
* > 此处按照age大小排序
* @param o the object to be compared.
* >返回值是正数,当前对象大
* 返回值是负数,当前对象小
* 0 一样大
* @return
*/
@Override
public int compareTo(Object o) {
if (o==this){
return 0;
}
if(o instanceof Student){
Student other = (Student) o;
return this.age - other.age;
}
throw new RuntimeException("类型不匹配"); // 此处要抛运行时异常,不能随便抛异常
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}