Comparable 与 Comparator

一、总起:两者的作用

首先,两者都是实现排序时的比较功能,比较两个元素,对其进行排序,都需要重写各自的比较方法。

使用 Comparable 必须要修改原有的类,也就是你要排序那个类,就要在那个中实现 Comparable 接口并重写 compareTo 方法,所以 Comparable 更像是“对内”进行排序的接口。​

Comparator 无需修改原有类。也就是在最极端情况下,即使 Person 类是第三方提供的,我们依然可以通过创建新的自定义比较器 Comparator,来实现对第三方类 Person 的排序功能。

也就是说通过 Comparator 接口可以实现和原有类的解耦,在不修改原有类的情况下实现排序功能,所以 Comparator 可以看作是“对外”提供排序的接口。

二、Comparable实现:

2.1、创建一个Person类:

Person类,实现Comparable接口,重写comparaTo方法

package com.bijiao;

/**
 * @program: st
 * @ClassName Person
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 15:58
 * @Version 1.0
 **/

public class Person implements Comparable<Person> {
    private String name;
    private int age;


    //实现Comparable中的comparaTo方法,调用时是升序排序
    @Override
    public int compareTo(Person o) {
        return this.age - o.getAge();
    }

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

    public Person() {
    }

    public Person(String name, int age) {
        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;
    }
}

2.2、Test测试类的实现:

package com.bijiao;

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

/**
 * @program: st
 * @ClassName ComparaTest
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 16:29
 * @Version 1.0
 **/

public class ComparaTest {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person("DDD",20));
        persons.add(new Person("BBB",25));
        persons.add(new Person("EEE",24));
        persons.add(new Person("BBB",15));
        persons.add(new Person("CCC",26));

        System.out.println("排序前:");
        for (Person person : persons) {
            System.out.println(person);
        }
        System.out.println("-------------------");
        Collections.sort(persons);
        System.out.println("排序后:");
        for (Person person : persons) {
            System.out.println(person);
        }

    }
}

三、Comparator实现:

3.1、创建Person类:

在使用Comparator接口实现时,由于是在非自己编写的代码或者原有类的代码已经编写好了,不便再对原来的类进行修改,故而在外部创建的类和方法。

package com.bijiaoqi;

/**
 * @program: st
 * @ClassName Person
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 17:11
 * @Version 1.0
 **/

public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        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 Person() {
    }

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

3.2、 实现年龄的升序排列:

package com.bijiaoqi;

import java.util.Comparator;

/**
 * @program: st
 * @ClassName PersonComparator
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 17:16
 * @Version 1.0
 **/

public class AscPersonComparator implements Comparator<Person> {
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
}

3.3、 实现年龄的降序排列:

package com.bijiaoqi;

import java.util.Comparator;

/**
 * @program: st
 * @ClassName 实现降序排列
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 17:30
 * @Version 1.0
 **/

public class DescPersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o2.getAge()-o1.getAge();
    }
}

3.4、创建测试类,对两种排序进行调用查看:

package com.bijiaoqi;

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

/**
 * @program: st
 * @ClassName ComparaTest
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 17:16
 * @Version 1.0
 **/

public class ComparaTest {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person("DDD",20));
        persons.add(new Person("BBB",25));
        persons.add(new Person("EEE",24));
        persons.add(new Person("BBB",15));
        persons.add(new Person("CCC",26));

        System.out.println("排序前:");
        for (Person person : persons) {
            System.out.println(person);
        }
        System.out.println("-------------------");

        Collections.sort(persons, new AscPersonComparator());
        System.out.println("排序后:");
        for (Person person : persons) {
            System.out.println(person);
        }

        System.out.println("======================");
        Collections.sort(persons, new DescPersonComparator());
        System.out.println("排序后:");
        for (Person person : persons) {
            System.out.println(person);
        }
    }
}

四、Comparable与Comparator的总结

Comparable 和 Comparator 都是用来实现元素排序的,它们二者的区别如下:

  • Comparable 是“比较”的意思,而 Comparator 是“比较器”的意思;
  • Comparable 是通过重写 compareTo 方法实现排序的,而 Comparator 是通过重写 compare 方法实现排序的;
  • Comparable 必须由自定义类内部实现排序方法,而 Comparator 是外部定义并实现排序的。

所以用一句话总结二者的区别:Comparable 可以看作是“对内”进行排序接口,而 Comparator 是“对外”进行排序的接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值