【Java 中 Comparable 与 Comparator 的使用】

发布于:2024-10-11 ⋅ 阅读:(11) ⋅ 点赞:(0)

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 +
                '}';
    }
}