Java基础:比较器 Comparable 和 Comparator (内部比较器和外部比较器)

前言:

在前面 Collections 工具类的具体实现方法中,有一个 sort () 的排序的方法,那个时候我们集合中的元素都是 String 和 一些基本数据类型,如果我们在集合中插入对象呢?such as – Person,Studnet 等自定义的对象,当我们插入这些的时候是会报错的。如下图:
在这里插入图片描述
因为我们的程序不知道根据对象的哪一个属性进行排序,这时候就需要我们自己实现。

方法一: 内部比较器 – ComParable

Student.java – 在该类内部实现比较

package collection;

// 内部比较器
// 实现 Comparable 重写方法
public class Student implements Comparable{

    private int id;
    private String name;
    private int age;

    public Student() {

    }

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        // 进去强制转换
        Student inputStudent = (Student) o;

        // 根据返回值作比较 -- 如果 id 相等 根据 姓名进行排序
        // this 表示当前对象,另一个为传过来的对象
        int result = this.id > inputStudent.id ? 1 : (this.id == inputStudent.id ? 0 : -1);

        if (result == 0) {
            // 调用 String 已经重写过的 compareTo() 方法
            result = this.name.compareTo(inputStudent.name);
        }
        return result;
    }
}

Test.java

package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test05 {

    public static void main(String[] args) {

        List<Student> list = new ArrayList<>();

        // 添加 Student 对象
        list.add(new Student(12,"zs",18));
        list.add(new Student(6,"ls",12));
        list.add(new Student(90,"ww",11));

        System.out.println("未排序前" + list);
        // 进行排序
        Collections.sort(list);

        System.out.println("排序后:" + list);

    }
}


效果图:
在这里插入图片描述

方法二: 外部实现器 – Comparator

通过新建一个类用于专门实现其比较: 无侵入性,不会对原代码有影响(比较推荐)
Person.java – 向集合中添加的 对象

package collection;

public class Person {

    private int id;
    private String name;
    private int age;

    public Person() {

    }

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

MyComparatorWithId.java – 进行比较

package collection;

import java.util.Comparator;

public class MyComparatorWithId implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
		// 传入两个对象进行比较 -- 与 C或C++中结构体比较类似
        Person p1 = (Person) o1;
        Person p2 = (Person) o2;
        
        // 根据返回值进行比较
        return  p1.getId() - p2.getId();

    }
}

Test.java

package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test06 {

    // 外部比较器,无侵入性,对原代码无影响
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();

        list.add(new Person(23,"ls",45));
        list.add(new Person(27,"ww",65));
        list.add(new Person(3,"zs",12));

        System.out.println("未排序前" + list);

        // 第二个参数是一个对象
        Collections.sort(list,new MyComparatorWithId());

        System.out.println("排序后:" + list);
    }

}

效果图:
在这里插入图片描述

后记:

如果有解释的不到位的地方或者有疑问的地方,欢迎在下面留言提出,大家共同进步,
加油!!!

猜你喜欢

转载自blog.csdn.net/qq_43619271/article/details/106288690