我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中的Comparable和Comparator接口

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中的Comparable和Comparator接口

一. Comparable接口

1. Comparable简介

Comparable是排序接口。

若一个类实现了Comparable接口,就意味着该类支持排序。

实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

Comparable接口的源码

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

2. 为什么要实现Comparable接口

一个类型实现了Compareable接口,表明了这个类具有了可排序的功能或者说标准,两个对象通过Compareable接口中的compareTo方法的返回值来比较大小。

首先定义一个学生对象, 再给定一个学生对象数组, 对这个对象数组中的元素进行排序(按年龄升序), 我们知道操作数组的工具包Arrays中有一个现成的 sort 方法可以给数组元素进行排序, 能否直接使用这个方法呢?

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Test {
    public static void main(String[] args) {
        Student[] stu = {
                new Student("zhansan",18),
                new Student("lisi", 20),
                new Student("zhaoliu",15)
        };
        Arrays.sort(stu);
        System.out.println(Arrays.toString(stu));
    }
}

程序运行时出现了类型转换异常

img

此时去跳转到异常提示的位置查看,可以发现源码中是将数组元素强制转换为Comparable类型,再去调用其中的compareTo方法,而此时我们自定义类型Student与Comparable毫不相干,Student类中是没有compareTo方法的。

img

再看一个例子,定义一个字符串数组将其排序后输出

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        String[] str = {"xin","abc","rong","def"};
        Arrays.sort(str);
        System.out.println(Arrays.toString(str));
    }
}

执行发现可以完成排序

img

再去观察String类的源码,可以发现String类也实现了Comparable接口重写了compareTo方法

img

img

此时就可以理解实现Comparable接口的原因

3. Comparable的实际应用

理解了Comparable接口后再来实现 给对象数组排序

让 Student 类实现 Comparable 接口, 并实现其中的 compareTo 方法

在 sort 方法中会自动调用 compareTo 方法, compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象.

然后比较当前对象和参数对象的大小关系(按年龄来算). 如果当前对象应排在参数对象之前, 返回大于 0 的数字; 如果当前对象应排在参数对象之后, 返回小于于 0 的数字; 如果当前对象和参数对象不分先后, 返回 0; 再次执行程序, 结果就符合预期了.

import java.util.Arrays;
class Student implements Comparable<Student>{
    private String name;
    private int age;

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

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

    @Override
    public int compareTo(Student o) {
        if (this.age == o.age){
            return 0;
        }else if (this.age < o.age){
            return -1;
        }else {
            return 1;
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Student[] stu = {
                new Student("zhansan",18),
                new Student("lisi", 20),
                new Student("zhaoliu",15)
        };

        Arrays.sort(stu);
        System.out.println(Arrays.toString(stu));
    }
}

执行结果:

img

注意事项:

对于 sort 方法来说, 需要传入的数组的每个对象都是 “可比较” 的, 需要具备 compareTo 这样的能力. 通 过重写 compareTo 方法的方式, 就可以定义比较规则.

这里自己实现一个 sort 方法来完成排序过程(使用冒泡排序)

public static void bubbleSort(Comparable[] array) {
        for (int i = 0; i < array.length-1; i++) {
            for (int j = 0; j < array.length-1-i; j++) {
                if(array[j].compareTo(array[j+1]) > 0) {
                    Comparable tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp; 
                }
            }
        }
}

二. Comparator接口

1. Comparator简介

Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

Comparator接口源码:

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

可以看到Comparator接口中包含两个抽象抽象方法,分别是为compare, equals,但类实现此接口时,只需要实现的接口只有compare方法即可;

Java中类都继承于Object类,而Object类默认实现了equals方法,所以类实现Comparator接口,实现类中不需要必须去实现equals方法,可以理解为虽然我们没有去实现,但实现类继承于Object类,相当于实现类中已经默认实现了equals方法

2. Comparator接口的实际运用

Arrays.sort()中有下面给出的重载,可以用来排序自定义类型

Arrays.sort(T[] a, Comparator<? super T> c);

此时的sort方法中的第二个参数我们传入一个实现了java.util.Comparator接口的实例,所以在排序自定义类型时可以定义一个比较器去实现

下面分别以以对象的name和age属性定义俩个比较器,分别以这两个比较器去实现排序

在以name进行比较时,实际上是以字符串进行比较,String类实现了Comparable接口,所以可以直接调用comparTo方法。

import java.util.Arrays;
import java.util.Comparator;

class AgeComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return o1.getAge() - o2.getAge();
    }
}

class NameComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

class Student {
    private String name;
    private int age;

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

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student[] stu = {
                new Student("ghi",18),
                new Student("def", 15),
                new Student("abc",20)
        };
        System.out.println("以年龄进行排序");
        Arrays.sort(stu, new AgeComparator());
        System.out.println(Arrays.toString(stu));

        System.out.println("再以姓名进行排序");
        Arrays.sort(stu, new NameComparator());
        System.out.println(Arrays.toString(stu));
    }
}

执行结果:

img

下面的代码是使用比较器比较对象

public class Test {
    public static void main(String[] args) {
        Student student1 = new Student("xin",10);
        Student student2 = new Student("rong",40);

        AgeComparator ageComparator = new AgeComparator();

        if(ageComparator.compare(student1,student2) > 0) {
            System.out.println("student1 > student2");
        }else if(ageComparator.compare(student1,student2) == 0){
            System.out.println("student1 = student2");
        }else{
            System.out.println("student1 < student2");
        }
    }

执行结果:

img

三. Comparable和Comparator的比较

Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”;而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

Comparable 对类的侵入性非常强, 一但投入使用便不方便再做修改,用起来比较简单,只要实现Comparable 接口的对象直接就成为一个可以比较的对象,需要重写comparTo方法,所以如果想要更换比较方式,就需要对comparTo “大动干戈”。

Comparator 对类的侵入性比较弱, 使用起来非常灵活,用Comparator实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 使用Comparator比较,如果想要更换比较方式,只需要在原来的基础上再增加一个比较器即可。

到此这篇关于Java中的Comparable和Comparator接口的文章就介绍到这了,更多相关Java Comparable 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中的Comparable和Comparator接口

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java集合之Comparable和Comparator接口详解

Java提供了Comparable接口与Comparator接口,它们为数组或集合中的元素提供了排序逻辑,实现此接口的对象数组或集合可以通过Arrays.sort或Collections.sort进行自动排序。本文将通过示例讲讲它们的使用,需要的可以参考一下
2022-12-08

关于Java中Comparable和Comparator的用法

这篇文章主要介绍了关于Java中Comparable和Comparator的用法,Comparable和Comparator是关于排序的两个接口,用来实现Java集合中的的排序功能,需要的朋友可以参考下
2023-05-14

Java中Comparable和Comparator怎么使用

这篇文章主要讲解了“Java中Comparable和Comparator怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中Comparable和Comparator怎么使用”吧
2023-07-05

Comparable与Comparator接口中Java中有什么不同

Comparable与Comparator接口中Java中有什么不同?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。详解Java中Comparable和Comparator接
2023-05-31

java中comparable和comparator的区别

确定两个对象之间的大小关系及排列顺序称为比较,能实现这个比较功能的类或方法称之为比较器,在java中有两种比较器。内部比较器(Comparable接口)和外部比较器(Comparator接口)一、比较器排序Comparator的使用——可以看做是类(对象)外部
java中comparable和comparator的区别
2015-02-01

java中的比较器comparable和Comparator的区别

Comparable比较器Comparable 位于 java.lang 包下,本质上是一个内比较器,实现了 Comparable 的类可以自己比较,至于比较的结果如何则需要依赖于自然比较方法 compareTo 的实现。compareTo 的返回值有 -1、
java中的比较器comparable和Comparator的区别
2020-05-16

一文搞清楚Java中Comparable和Comparator的区别

Java中的Comparable和Comparator都是用于集合排序的接口,但它们有明显的区别,文中通过一些实例代码详细介绍了Java中Comparable和Comparator的区别,感兴趣的同学跟着小编一起学习吧
2023-05-19

java 中Comparable与Comparator详解与比较

java 中Comparable与Comparator详解今天查看TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Co
2023-05-31

java comparable接口的作用是什么

Java的Comparable接口是一个泛型接口,用于对实现它的类的对象进行排序。它定义了一个compareTo()方法,该方法用于比较对象的顺序。具体来说,Comparable接口的作用如下:1. 对象排序:通过实现Comparable接
2023-09-20

Java去重排序之Comparable与Comparator的使用及说明

这篇文章主要介绍了Java去重排序之Comparable与Comparator的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-14

java中Comparable接口排序怎么实现自定义

今天就跟大家聊聊有关java中Comparable接口排序怎么实现自定义,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实例如下所示:class Student implements
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录