Java-----Comparable接口和Comparator接口

在Java中,我们会经常使用到自定义类,那我们如何进行自定义类的比较呢?

1.Comparable接口

普通数据的比较

        int a=10;
        int b=91;
        System.out.println(a<b);

那自定义类型可不可以这样比较呢?看一下代码

6bdf30df004947c5a3408055fb640003.png

我们发现会报错,因为自定义类型,stu1和stu2里面存的是引用,是无法直接根据姓名或年龄进行比较的。

1.1Comparable接口的使用

 如果想要自定义类型根据年龄和名字进行比较,这时候就要用到我们的Comparable接口。

54111f81c7bf4d569009d9641ad604d4.png

当我们观察Comparable接口的底层细节会发现有一个<T>和一个方法,<T>代表我们要比较的类型,方法是我们根据实际情况来重写compareTo方法,也就是比较的规则。

1.根据年龄比较 

自定义类中具体实现

class Student implements Comparable<Student>{
    public String name;
    public int age;

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

    @Override
    public int compareTo(Student o) {
        //根据年龄比较
        /*if(this.age>o.age){
            return 1;
        }else if (this.age==o.age){
            return 0;
        }else {
            return -1;
        }*/
        return this.age-o.age;
    }
}

完整代码

class Student implements Comparable<Student>{
    public String name;
    public int age;

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

    @Override
    public int compareTo(Student o) {
        //根据年龄比较
        /*if(this.age>o.age){
            return 1;
        }else if (this.age==o.age){
            return 0;
        }else {
            return -1;
        }*/
        return this.age-o.age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student stu1=new Student("zhansan",18);
        Student stu2=new Student("man",24);
        System.out.println(stu1.compareTo(stu2));
    }
}

2.根据名字比较

class Student implements Comparable<Student>{
    public String name;
    public int age;

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

    @Override
    public int compareTo(Student o) {
        return this.name.compareTo(o.name);
    }
}
public class Test {
    public static void main(String[] args) {
        Student stu1=new Student("zhansan",18);
        Student stu2=new Student("man",24);
        System.out.println(stu1.compareTo(stu2));
    }
}

由于名字是String类,String类在底层中也实现了compareTo方法,所以我们可以直接调用compareTo方法来实现名字的比较。

3. 多个对象之间的比较

多个对象我们可以用一个对应类的数组来存储,然后思路就是让数组里面的元素就行比较。

这里模拟了冒泡排序进行比较。

根据名字来排序

import java.util.Arrays;

class Student implements Comparable<Student>{
    public String name;
    public 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) {
        return this.name.compareTo(o.name);
    }
}
public class Test {
    public static void mysort(Comparable[] comparables){
        for (int i = 0; i < comparables.length-1; i++) {
            for(int j=0;j<comparables.length-1-i;j++){
                if(comparables[j].compareTo(comparables[j+1])>0){
                    Comparable tmp=comparables[j];
                    comparables[j]=comparables[j+1];
                    comparables[j+1]=tmp;
                }
            }
        }
    }
    public static void main(String[] args) {
        Student[] students=new Student[]{
                new Student("zhansan",18),
                new Student("man",24),
                new Student("lebron",23)
        };
        mysort(students);
        System.out.println(Arrays.toString(students));

    }
}

5dbe17b651df48f2862d2f35deb2ae09.png

根据年龄来排序

import java.util.Arrays;

class Student implements Comparable<Student>{
    public String name;
    public 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) {
        return this.age-o.age;
    }
}
public class Test {
    public static void mysort(Comparable[] comparables){
        for (int i = 0; i < comparables.length-1; i++) {
            for(int j=0;j<comparables.length-1-i;j++){
                if(comparables[j].compareTo(comparables[j+1])>0){
                    Comparable tmp=comparables[j];
                    comparables[j]=comparables[j+1];
                    comparables[j+1]=tmp;
                }
            }
        }
    }
    public static void main(String[] args) {
        Student[] students=new Student[]{
                new Student("zhansan",18),
                new Student("man",24),
                new Student("lebron",23)
        };
        mysort(students);
        System.out.println(Arrays.toString(students));

    }
}

c6c90da46f6a4de593d9ef705bc21934.png

 3.总结

1.当前阶段如果我们想要进行自定义类型之间的比较,我们要使用Comparable接口。

2.重写接口里面的方法是我们根据需求来决定如何重写compareTo方法,重写后的compareTo方法里面的具体实现就是我们的比较规则。

2.Comparator接口

我们发现当我们使用Comparable接口时并不是那么灵活,因为它实现的比较规则是写死的,如果我们想要换一种比较规则,我们必须要对实现对比较方法里面的重新构造。

那有没有比较灵活的比较方式呢?答案就是Comparator接口。

AgeComparator类

public class AgeComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age- o2.age;
    }
}

NameComparator类

public class NameComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);
    }
}

主函数部分

根据年龄排序

public class Test {
    public static void main(String[] args) {
        Student[] students=new Student[]{
                new Student("zhansan",18),
                new Student("man",24),
                new Student("lebron",23)
        };
        NameComparator nameComparator=new NameComparator();
        AgeComparator ageComparator=new AgeComparator();
        Arrays.sort(students,ageComparator);
        System.out.println(Arrays.toString(students));

    }
}

35b307211565411f8fbd235f41347ebe.png

根据名字比较

public class Test {
    public static void main(String[] args) {
        Student[] students=new Student[]{
                new Student("zhansan",18),
                new Student("man",24),
                new Student("lebron",23)
        };
        NameComparator nameComparator=new NameComparator();
        AgeComparator ageComparator=new AgeComparator();
        Arrays.sort(students,nameComparator);
        System.out.println(Arrays.toString(students));

    }
}

725a56b1be3a42a2abc0d7ad91f2b4f3.png

这里我们定义了AgeComparator类和NameComparator类,它们都使用了Comparator这个接口,

然后在自己的类里面重写了compareTo方法。

根据以上类实现的对象可以认为是比较规则,将这些对象作为sort函数的参数,就可以灵活实现不同比较方式的转变。

相对于Comparable接口来说,Comparator不需要改变函数内部的具体实现来改变比较规则,只需改变函数的参数就行了,这样更安全也更方便。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/663306.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电机控制系列模块解析(25)—— 过压抑制与欠压抑制

一、概念解析 变频器作为一种重要的电机驱动装置&#xff0c;其内置的保护功能对于确保系统安全、稳定运行至关重要。以下是关于变频器过压抑制、欠压抑制&#xff08;晃电抑制&#xff09;、发电功率限制、电动功率限制等保护功能的详细说明&#xff1a; 过压抑制 过压抑制是…

YoloV8改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

摘要 在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。 改进方法简单高效,需要发论文的同学不要错过! 论文指导 PConv在论文中的描述 论文: 下面我们展示了可以通过利用特征图的冗余来进一步优化成本。如图3所…

golang web补充知识:单元测试

文章目录 golang 单元测试引言单元测试的重要性Go语言单元测试的优势 Go语言单元测试基础testing包辅助测试函数运行单元测试 Mock技术Mock简介GoMock框架介绍编写Mock代码使用Mock进行单元测试 面向测试编程&#xff08;TDD&#xff09;TDD简介TDD的优势TDD的基本步骤Go语言中…

discuz如何添加主导航

大家好&#xff0c;今天教大家怎么样给discuz添加主导航。方法其实很简单&#xff0c;大家跟着我操作既可。一个网站的导航栏是非常重要的&#xff0c;一般用户进入网站的第一印象就是看网站的导航栏。如果大家想看效果的话可以搜索下网创有方&#xff0c;或者直接点击查看效果…

大数据中的电商数仓项目:探秘业务的核心

我学习完一个电商数仓的项目和电影实时推荐项目&#xff0c;便兴冲冲的去面试大数据开发岗&#xff0c;在面试的时候&#xff0c;面试官总是喜欢问&#xff0c;聊聊你为什么要做这个项目以及你这个项目有哪些业务&#xff1f; 我心想&#xff0c;为什么要做这个业务&#xff1f…

重学java 52.集合 斗地主案例

你太锐利了&#xff0c;这些年来&#xff0c;风霜雨雪&#xff0c;踉跄清冷&#xff0c;我相信你所有的苦楚 —— 24.5.30 1 案例介绍 按照斗地主的规则&#xff0c;完成洗牌发牌的动作。 具体规则: 使用54张牌打乱顺序,三个玩家参与游戏&#xff0c;三人交替摸牌&#xff0c…

ipv6基础

地址 前缀子网主机位 PI法则3.14 前缀&#xff1a;3个16位 子网&#xff1a;1个16位 接口ID&#xff1a;4个16位 地址分类 未指定地址 ::/128 &#xff0c;类似于0.0.0.0 本地回环地址 ::1/128 &#xff0c;用于本地测试&#xff0c;类似于127.0.0.1 本地链路地址&#x…

【云原生】kubernetes中pod的生命周期、探测钩子的实战应用案例解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

正则匹配优化:匹配排除多个字符串的其他字符串

(^entity|^with|...)\w优化 (?!entity|with|has|index|associations|input)\w(?!): 匹配排除项 效果 继续优化 匹配会过滤掉带有关键字的字段&#xff0c;在过滤的时候是可以加上尾部结束匹配符的 效果&#xff1a;

JS-Lodash工具库

文档&#xff1a;Lodash Documentation orderBy函数&#xff1a;根据条件进行排序 注&#xff1a;第一个是要排序的数组&#xff0c;第二个是根据什么字段进行排序&#xff0c;第三个是排序的方式&#xff08;desc倒序&#xff09; 安装方式&#xff1a;Lodash npm i lodash…

【码银送书第二十期】《游戏运营与出海实战:策略、方法与技巧》

市面上的游戏品种繁杂&#xff0c;琳琅满目&#xff0c;它们是如何在历史的长河中逐步演变成今天的模式的呢&#xff1f;接下来&#xff0c;我们先回顾游戏的发展史&#xff0c;然后按照时间轴来叙述游戏运营的兴起。 作者&#xff1a;艾小米 本文经机械工业出版社授权转载&a…

平衡二叉树(oj题)

一、题目链接&#xff1a; https://leetcode.cn/problems/balanced-binary-tree/submissions/536133365 二、思路 调用深度计算函数&#xff0c;得到每次当前的根结点的左右子树的深度。比较每次得到的左右子树深度之差 如果当前根节点的左右子树的深度差大于1,说明不是平衡…

03-树2 List Leaves(浙大数据结构PTA习题)

03-树2 List Leaves 分数 25 全屏浏览 切换布局 作者 陈越 单位 浙江大学 Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each input file contains one test c…

mac 安装java jdk8 jdk11 jdk17 等

oracle官网 https://www.oracle.com/java/technologies/downloads/ 查看当前电脑是英特尔的x86 还是arm uname -m 选择指定版本&#xff0c;指定平台的安装包&#xff1a; JDK8 JDK11的&#xff0c;需要当前页面往下拉&#xff1a; 下载到的安装包&#xff0c;双击安装&#x…

Linux系统编程(六)线程同步机制

本文目录 前述&#xff1a;同步机制的引入及概念一、线程的互斥锁1. 定义2. 互斥锁常用方法3. 相关函数&#xff08;1&#xff09;头文件&#xff08;2&#xff09;创建互斥锁&#xff08;3&#xff09;销毁互斥锁&#xff08;4&#xff09;加锁&#xff08;5&#xff09;解锁 …

Java Sort 方法的使用(包含Arrays.sort(),Collections.sort()以及Comparable,Comparator的使用 )

目录 Comparable && Comparator的使用&#xff1a; Comparable: Comparator: Arrays.sort()的使用: 升序排序&#xff1a; 降序排序&#xff1a; 自定义排序方法&#xff1a; 在日常的刷题或开发中&#xff0c;很多时候我们需要对数据进行排序&#xff0c;以达到我…

【C++修行之道】类和对象(二)类的6个默认成员函数、构造函数、析构函数

目录 一、类的6个默认成员函数 二、构造函数 2.1 概念 2.2 特性 2.2.5 自动生成默认构造函数 不进行显示定义的隐患&#xff1a; 2.2.6 自动生成的构造函数意义何在&#xff1f; 两个栈实现一个队列 2.2.7 无参的构造函数和全缺省的构造函数都称为默认构造函数&#x…

ELK 使用 metricbeat监控数据

IP功能版本192.168.140.153elk-18.13.4192.168.140.153metricbeat8.13.4192.168.140.156elk-28.13.4192.168.140.156metricbeat8.13.4192.168.140.159logstash8.13.4192.168.140.159kibana8.13.4 一、安装ELK 参考文档&#xff1a; https://download.csdn.net/download/weix…

【免费Web系列】JavaWeb实战项目案例四

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 多表操作&员工列表查询 1. 多表关系 关于单表的操作(单表的设计、单表的增删改查)我们就已经学习完了。接下来我们就要来学习多表的操作&#xff0c;首先来学习多表的设计。 项目开发中&#xff0…

2023年全球DDoS攻击现状与趋势分析

天翼安全科技有限公司副总工程师、运营保障部总经理陈林表示&#xff0c;2023年扫段攻击频次快速增长&#xff0c;成为网络基础设施面临的最大威胁。为躲避防御&#xff0c;低速扫段攻击成为主流达到攻击总数的73.19%&#xff1b;43.26%的C段攻击持续时间小于5分钟&#xff0c;…