对象比较:Comparable 和 Comparator

java中我们如何给对象排序?这就必须借助Comparator 或 Comparable。有了他们就意味着你可用实现对象之间的比较。也就可用做到排序了。

Comparable

Comparable 也被称为自然排序,只要实现了这个接口的类实例化出来的对象都可以称为 可比较对象 下面是Comparator 接口定义的方法:

public interface Comparable<T> {
    public int compareTo(T o);
}

Comparable中只定义了一个comparaTo的方法接收一个泛型参数,返回int类型。比较规则如下:

  • 返回整数 当前对象大于目标对象
  • 返回0  当前对象等于目标对象
  • 返回负数 当前对象小于目标对象

比如我们要给一个对象Person排序,那么就先实现Comparable接口,再调用集合排序的方法,那么就会按照我们定义的排序规则进行排序import java.util.ArrayList;

复制代码
import java.util.Collections;
import java.util.List;

public class Person implements Comparable<Person>{
    private int id;
    private String sname;
    private int age;
    
    public Person() {}
    
    public Person(int id, String sname, int age) {
        this.id = id;
        this.sname = sname;
        this.age = age;
    }
    
    
    
    public int getId() {
        return id;
    }


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


    public String getSname() {
        return sname;
    }


    public void setSname(String sname) {
        this.sname = sname;
    }


    public int getAge() {
        return age;
    }


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


    @Override
    public int compareTo(Person o) {
        // TODO Auto-generated method stub
        //比较规则:根据id比较
        return this.id - o.id;
    }  
}
复制代码
复制代码
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person(3, "d", 342));
        list.add(new Person(1, "z", 1));
        list.add(new Person(4, "z", 1));
        list.add(new Person(5, "z", 1));
        list.add(new Person(2, "z", 1));
        //排序
        Collections.sort(list);
        
        for (Person person : list) {
            System.out.println(person.getId());
        }
    }
复制代码

执行结果:

1
2
3
4
5

Collections会调用对象的compareTo方法进行比较,根据执行结果导出我的结论完全正确

Comparator 

也被称为自定义排序。当我们的类没有实现Comparator或者compareTo定义的排序规则不符号我们当前的要求,比如我有的地方要根据id排序,有的地方要更具age排序。那么我们就可用借助Comparator来实现。Comparator定义了排序的规则

public interface Comparator<T> {
    int compare(T o1, T o2);
}

非常简单

返回整数 o1 > o2

返回0 o1 == 02

返回负数 o1 < 02

还是上面那个例子,我们要实现根据年龄排序,但不能更改现有排序规则,那么就可以使用Comparator来定义排序规则

复制代码
import java.util.Comparator;

public class AgeSort implements Comparator<Person>{

    @Override
    public int compare(Person o1, Person o2) {
        // TODO Auto-generated method stub
        return o1.getAge() - o2.getAge();
    }

}
复制代码
复制代码
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person(3, "d", 4));
        list.add(new Person(1, "z", 45));
        list.add(new Person(4, "z", 1));
        list.add(new Person(5, "z", 3));
        list.add(new Person(2, "z", 2));
        
        //指定规则排序(根据年龄)
        Collections.sort(list, new AgeSort());
        
        for (Person person : list) {
            System.out.println("id" + person.getId() + ",age" + person.getAge());
        }
    }
复制代码

运行结果:

id4,age1
id2,age2
id5,age3
id3,age4
id1,age45

 

 

Comparable 和 Comparator的比较

1、Comparable一个类只能定义一个,而且一个规则只能用于一个类。Comparator可用将排序规则抽象成一个类。在排序的时候指定使用那个Comparator就可用了,Comparable更加灵活

2、实现Comparable比Comparator的耦合性要强,如果那一天需求变动要修改比较规则。那么就要修改Comparable的实现类,而Comparator因为是外部定义的所有不需要对排序类做如何修改,你可用修改Comparator实现类排序规则,或者保留原有的重新写一个Comparator都行.

 

posted @   小cai一碟  阅读(659)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示