关于Comparator和Comparable的理解

简介: 关于Comparator和Comparable的理解

我们都知道,实现 ComparatorComparable这两个接口,可以实现对对象比较大小。那这两个又有什么区别呢?

comparator

1、接口类在 java.util包里面,实现接口时需要导入该包。

2、一般新建一个类实现这个接口,用来比较其他对象的大小。实现这个接口时,对象不能把自己和其他对象相比较。

3、实现 publicintcompare(Objecto1,Objecto2),当实现类使用了泛型时, Object可以换成具体的类型。

import java.util.Comparator;
public class StudentComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        //在这里我们把age作为对象比较大小的依据
        if (o1.getAge() > o2.getAge())
            return 1;
        else if (o1.getAge()<o2.getAge())
            return  -1;
        return 0;//如果两个对象相等,返回0
    }
}

comparable

1、接口类在 java.lang包里面,实现接口时无需导包。

2、一般是需要比较大小的类直接实现这个接口,因为实现这个接口时,支持自己直接和另一个对象比较大小。

3、实现 publicintcompareTo(Objecto)方法,当实现类使用了泛型时,Object也可以换成具体的类型

public class Student implements Comparable<Student> {
    private String name;
    private int 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;
    }
    @Override
    public int compareTo(Student student) {
        //在这里我们把age作为对象比较大小的依据
        if (this.age > student.getAge())
            return 1;
        else if (this.age<student.getAge())
            return  -1;
        return 0;//如果两个对象相等,返回0
    }
}

相同点

       两者实现的函数的返回值一样,都是int类型的。当要对对象按照某个属性进行比较大小排序时,返回值不同,会影响排序的顺序。例如,如果按照年龄的大小对 Student进行排序时,如果按照从小到大的顺序进行排序时, compareTo的实现方法如下:

1、比较者大于被比较者(也就是 compareTo方法里面的对象),那么返回正整数

2、比较者等于被比较者,那么返回0

3、比较者小于被比较者,那么返回负整数

如果按照从大到小的顺序进行排序时,只需把1和3中的返回值互换。

实现排序的主函数如下所示:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("张三");
        s1.setAge(18);
        Student s2 = new Student();
        s2.setName("李四");
        s2.setAge(19);
        Student s3 = new Student();
        s3.setName("王五");
        s3.setAge(22);
        List<Student> list = new ArrayList<Student>();
        list.add(s2);
        list.add(s3);
        list.add(s1);
        Student[] students1 = new Student[list.size()];//数组的大小需要和集合的长度保持一致,如果数组过长,后面会被自动赋值null,排序时报空指针异常
        list.toArray(students1);//集合转换成数组
        list.sort(new StudentComparator());//集合排序
        Arrays.sort(students1);//数组排序
        for (Student student : list) {
            System.out.println(student.getName());
        }
    }
}
目录
相关文章
|
3月前
|
Java
Java中的比较器Comparable与Comparator
Java中的比较器Comparable与Comparator
|
4月前
|
Java
Comparable和Comparator两种比较器详解
Comparable和Comparator两种比较器详解
19 0
|
8月前
Comparable与Comparator对象比较
Comparable与Comparator对象比较
30 0
Comparable 和 Comparator的理解
Comparable是一个排序接口 此接口给实现类提供了一个排序的方法,此接口有且只有一个方法
95 0
Comparable 和 Comparator的理解
排序Comparable 和 Comparator的区别
排序Comparable 和 Comparator的区别
|
搜索推荐 算法 安全
浅谈Comparable和Comparator
首先我们考虑一个场景:有一个整形数组, 我们希望通过调用一个工具类的排序方法就能对该数组进行排序. 请看下面的代码:
Comparable与Comparator有什么区别?
Comparable与Comparator有什么区别?
177 0
|
Java
Java对象的比较和排序(Comparator和Comparable)
Java对象的比较和排序(Comparator和Comparable)
121 0
Java对象的比较和排序(Comparator和Comparable)
|
Java
Comparable接口和Comparator接口
Comparable接口和Comparator接口
184 0
Comparable接口和Comparator接口