comparable与comparator接口(java)

介绍

Comparator 接口和 Comparable 接口都是用于实现对象比较的接口,但它们有不同的应用场景和使用方式。

comparable

  1. 位置: 实现 Comparable 接口的类在类的定义中直接实现了这个接口。
  2. 目的: 用于提供对象之间的自然顺序,也就是默认的排序规则。
  3. 方法: 实现了 Comparable 接口的类必须实现 compareTo 方法,该方法返回一个负数、零或正数,分别表示当前对象小于、等于或大于传入的对象。
  4. 使用场景: 适用于那些在对象之间存在明显的自然顺序关系的情况,例如数字、字母等。

 搭配compareTo,对原来的类进行操作,参数只有一个。

comparator

  1. 位置: 实现 Comparator 接口的类通常独立于要比较的类,并在需要比较时作为独立的比较器类传递。
  2. 目的: 提供一种灵活的比较机制,允许在不修改类本身的情况下定义多个不同的比较规则。
  3. 方法: 实现 Comparator 接口的类必须实现 compare 方法,该方法也返回一个负数、零或正数,用于表示两个对象的比较结果。
  4. 使用场景: 适用于需要多种不同的排序规则,或者对于无法修改源代码的类进行比较的情况。

搭配compare,新建一个类进行操作,参数有两个 

示例代码

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

// 实现 Comparable 接口的类
class Person implements Comparable<Person> {
    String name;
    int age;

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

    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }

    @Override
    public String toString() {
        return name + " - " + age;
    }
}

// 实现 Comparator 接口的类
class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.name.compareTo(p2.name);
    }
}

public class ComparisonExample {
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 25));
        people.add(new Person("Bob", 20));
        people.add(new Person("Charlie", 30));

        // 使用 Comparable 接口进行排序
        Collections.sort(people);
        System.out.println("按年龄从小到大排序:" + people);

        // 使用 Comparator 接口进行排序
        Collections.sort(people, new PersonComparator());
        System.out.println("按姓名字典序排序:" + people);
    }
}

(by 归忆)

猜你喜欢

转载自blog.csdn.net/qq1677852098/article/details/134652482