Java比较器

一、概述

       在Java中,比较器是一种用于定义对象排序顺序的接口,提供了Comparable和Comparator这两个接口来实现对象的排序。


二、Comparable自然排序

1、Comparable接口

       Comparable接口用于对象的自然排序,可以使用Java内置的排序算法(如Arrays.sort()和Collections.sort())进行排序。接口中只包含一个抽象方法compareTo(T o),用于比较当前对象与指定对象的顺序,返回值是一个整数,表示比较结果,结果的含义如下:

  • 1)、如果返回值 < 0,表示当前对象小于指定对象。
  • 2)、如果返回值 = 0,表示当前对象等于指定对象。
  • 3)、如果返回值 > 0,表示当前对象大于指定对象。

2、Comparable接口的实现类:基本类型的包装类、String、···等都实现了该接口,重写了compareTo()方法给出了比较两个对象大小的方式。

  • 1)、Integer实现自然排序: 
    List<Integer> integers = Arrays.asList(5, 15, 33, 27, 3);
    Collections.sort(integers); // 调用排序方法进行排序
    System.out.println(integers); // 输出[3, 5, 15, 27, 33]
  • 2)、String实现自然排序:
    List<String> stringList = Arrays.asList("Java", "Python", "C++");
    Collections.sort(stringList); // 调用排序方法进行排序
    System.out.println(stringList); // 输出[C++, Java, Python]

3、自定义类实现Comparable实现自然排序:

  • 1)、创建自定义类并实现Comparable接口。
  • 2)、重写compareTo()方法,实现排序逻辑。
public class Person implements Comparable<Person> { // 实现Comparable接口
    private String name;
    private int age;

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

    /**
     * 重写compareTo接口实现排序逻辑:先根据年龄,再根据姓名进行排序
     * @param other the object to be compared.
     * @return
     */
    @Override
    public int compareTo(Person other) {
        // 首先比较年龄
        int ageComparison = Integer.compare(this.age, other.age);
        if (ageComparison != 0) {
            return ageComparison; // 如果年龄不同,直接返回年龄的比较结果
        }
        // 如果年龄相同,再比较名称(按字典顺序)
        return this.name.compareTo(other.name);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

    /**
     * 测试排序功能
     * @param args
     */
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Bob", 30),
                new Person("Alice", 25),
                new Person("Charlie", 25)
        );
        // 调用排序方法进行排序:根据年龄升序排序,年龄相同再根据姓名进行升序排序
        Collections.sort(people); 
        System.out.println(people); // 输出[Person{name='Alice', age=25}, Person{name='Charlie', age=25}, Person{name='Bob', age=30}]
    }

}

三、Comparator自定义排序

1、Comparator接口

        Comparator接口用于对象的自定义排序。主要用于对集合中的元素进行排序(如Arrays.sort()和Collections.sort()),常用作为方法的参数。接口中包含一个抽象方法compare(T o1, T o2),用于比较比较两个对象(o1和o2)的顺序,返回值是一个整数,表示比较结果,结果的含义如下:

  • 1)、如果返回值 < 0,表示o1小于o2。
  • 2)、如果返回值 = 0,表示o1等于o2。
  • 3)、如果返回值 > 0,表示o1大于o2。

2、Comparator的使用:主要用于作为方法的参数(如排序方法的参数)使用,有以下使用方式。

2.1 实现Comparator接口的方式

通过定义一个类实现Comparator接口,重写compare()方法实现排序逻辑。

public class AgeComparator implements Comparator<Student> { // 实现Comparator接口
    @Override
    public int compare(Student s1, Student s2) { // 重写compare()方法实现排序逻辑
        return Integer.compare(s1.getAge(), s2.getAge());
    }

    public static void main(String[] args) {
        List<Student> studentList = Arrays.asList(
                new Student("Bob", 30),
                new Student("Alice", 25),
                new Student("Charlie", 25)
        );
        // 实现Comparator接口的方式实现自定义排序
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值