【Java 基础】25 比较器

news2024/11/17 0:54:00

文章目录

    • 1.什么是比较器
    • 2.比较器的种类
      • 1)Comparable
      • 2)Comparator
      • 4)组合比较器
    • 总结

1.什么是比较器

比较器是用于对对象进行比较的工具

比较器允许开发者定义对象之间的顺序,使得排序和比较操作更加灵活。

还记得我们之前学的数组么?当数组里存了一组数据之后,我们可以使用 Arrays 类中提供的 sort() 方法对其排序,排序的时候会根据数值的大小进行排序。

在这里插入图片描述

当我们有这么一个数组的时候,顺序打印一下吧!

示例代码:

public class Demo {
    public static void main(String[] args) {
        int[] arr = {3,1,4,1,5,9,2,6};
        System.out.println("排序前:" + Arrays.toString(arr));
        // 将数组排序
        Arrays.sort(arr);
        System.out.println("排序后:" + Arrays.toString(arr));
    }
}

输出结果:

排序前:[3, 1, 4, 1, 5, 9, 2, 6]
排序后:[1, 1, 2, 3, 4, 5, 6, 9]

2.比较器的种类

Java 提供了两种主要的比较器:Comparable 接口 和 Comparator 接口

在这里插入图片描述

1)Comparable

这就好比是一个人天生就具有的技能!

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

从上面的源码定义我们可以看到,在这个接口中使用了泛型,也就是说它是一个所有数据类型通用的。

这个方法有一个 int 类型的返回值,分别代表下面含义:

No.返回值含义
11代表 大于
2-1代表 小于
30代表 等于

定义一串 字符串 数组,然后对其进行排序打印

示例代码:

public class Demo {
    public static void main(String[] args) {
        String[] arr = {"bbb", "ddd", "aaa", "ccc"};
        // 进行排序
        Arrays.sort(arr);
        // 输出排序后的结果
        System.out.println(Arrays.toString(arr));
    }
}

输出结果:

[aaa, bbb, ccc, ddd]

在这个例子中,字符串数组 arr 被排序,因为 String 类实现了 Comparable 接口,定义了字符串的自然顺序。

那么,String 类是否继承了 Comparable 接口呢?让我们去源码中看一眼吧

在这里插入图片描述

2)Comparator

这个好比是一个人生下来不会,但是我通过后天学习学会的技能!

@FunctionalInterface
public interface Comparator<T> {
    int compare(T var1, T var2);
    boolean equals(Object var1);
    …………
}

从上面的源码定义我们可以看到,在这个接口中使用了泛型,也就是说它也是一个所有数据类型通用的。

它也存在一个 compare 方法,也是一个 int 类型的返回值,代表含义和上面的 Comparable 一样

1:代表大于; -1:代表小于; 0:代表等于

定义一个 学生数组,然后对其按照一定规则(比如:年龄)进行排序打印

示例代码:

public class Demo {
    public static void main(String[] args) {
        String[] arr = {"aaaa", "cc", "ddd", "b"};
        // 使用自定义比较器进行排序
        Arrays.sort(arr, new LengthComparator());
        System.out.println(Arrays.toString(arr));
    }
}

class LengthComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        // 根据长度排序
        return Integer.compare(s1.length(), s2.length());
    }
}

输出结果:

[b, cc, ddd, aaaa]

在这个例子中,通过实现 Comparator 接口的 LengthComparator 类,我们定义了按字符串长度升序排序的比较器,对字符串数组进行排序。

Comparable 和 Comparator 区别

  • Comparable:
    • 实现了 Comparable 接口的类具有自然顺序
    • compareTo 方法定义了对象的默认排序规则
    • 适用于需要为对象定义一个主要的、默认的排序规则的情况
  • Comparator:
    • Comparator 接口提供了灵活的比较机制,允许定义多个不同的排序规则
    • compare 方法定义了对象的特定排序规则
    • 适用于需要多种排序规则,或者无法修改类本身的情况

4)组合比较器

通过组合比较器,可以实现多条件的排序。Java 8 引入了 Comparator 接口的 thenComparing 方法,使得组合比较器变得更加简单

定义一组学生,然后先按照年龄 再按照名字进行排序

示例代码:

public class Demo {
    public static void main(String[] args) {
        Stu[] students = new Stu[4];
        students[0] = new Stu("lisi", 22);
        students[1] = new Stu("wangwu", 22);
        students[2] = new Stu("zhangsan", 11);
        students[3] = new Stu("liuliu", 22);
        // 使用组合比较器进行排序
        Arrays.sort(students, Comparator.comparing(Stu::getAge).thenComparing(Stu::getName));
        // 输出结果
        for (Stu stu : students) {
            System.out.println(stu);
        }
    }
}

class Stu {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Person[" + "name='" + name + '\'' + ", age=" + age + ']';
    }
}

输出结果:

Person[name=‘zhangsan’, age=11]
Person[name=‘lisi’, age=22]
Person[name=‘liuliu’, age=22]
Person[name=‘wangwu’, age=22]

在这个例子中,Person 类实现了按年龄排序、然后按姓名排序。通过 Comparator.comparingthenComparing 方法,整成了组合比较器

总结

Java 提供了丰富的排序工具和灵活的排序方式,使得对数组进行排序变得简便而高效。这些工具可以根据元素类型的自然顺序自定义的排序来实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringAOP专栏二《原理篇》

上一篇SpringAOP专栏一《使用教程篇》-CSDN博客介绍了SpringAop如何使用&#xff0c;这一篇文章就会介绍Spring AOP 的底层实现原理&#xff0c;并通过源代码解析来详细阐述其实现过程。 前言 Spring AOP 的实现原理是基于动态代理和字节码操作的。不了解动态代理和字节码操作…

Sql Server Management Studio连接Mysql

目标 已知mysql连接参数&#xff08;地址和用户&#xff09;&#xff0c;期望通过Microsoft Sql Server Management Studio &#xff08;以下简称MSSSMS&#xff09;连接Mysql&#xff0c;在MSSSMS中直接查询或修改Mysql中的数据。 下载MySql Connector/ODBC并安装&#xff0c…

Python configparser 模块:优雅处理配置文件的得力工具

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 配置文件在软件开发中扮演着重要的角色&#xff0c;而Python中的 configparser 模块提供了一种优雅而灵活的方式来处理各种配置需求。本文将深入介绍 configparser 模块的各个方面&#xff0c;通过丰富的示例代码…

力扣(LeetCode)-1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

一个简单的 postman设置接口关联让我措施了大厂的机会

postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用postman获取上一个接口指定的返回值…

好莱坞明星识别

一、前期工作 1. 设置GPU from tensorflow import keras from tensorflow.keras import layers,models import os, PIL, pathlib import matplotlib.pyplot as plt import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:gpu0 …

mybatis数据输出-使用resultMap标签定义实体类属性和数据库字段对应关系,再在SQL语句中引用这个对应关系

有三种方式实现实体类属性和数据库字段对应关系 起别名对应&#xff0c;将字段的别名设置成和实体类属性一致全局配置自动识别驼峰式命名规则&#xff0c;在Mybatis全局配置文件加入配置 <setting name"mapUnderscoreToCamelCase" value"true"/>使用…

Pipenv环境配置+Pytest运行

环境配置 使用Pipenv进行虚拟环境管理&#xff0c;Pipfile为依赖模块管理文件。 安装pipenv&#xff1a;brew install pipenv根项目根目录下执行命令创建虚拟环境&#xff1a; pipenv install在Pycharm中指定项目运行的虚拟环境 &#xff1a;File->Settings->Project:-…

16mic圆形麦克风阵列电路与声源定位算法设计

16mic圆形麦克风阵列电路与声源定位算法设计 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送语音信号处理降噪算法&#xff0c;蓝牙耳机音频&#xff0c;DSP音频项目核心开发资料, 1 实…

消息队列kafka详解:Kafka重要知识点+面试题大全

重要面试知识点 Kafka 消费端确保一个 Partition 在一个消费者组内只能被一个消费者消费。这句话改怎么理解呢&#xff1f; 在同一个消费者组内&#xff0c;一个 Partition 只能被一个消费者消费。 在同一个消费者组内&#xff0c;所有消费者组合起来必定可以消费一个 Topic 下…

信号量的使用和注意事项

大家好&#xff0c;今天给大家介绍信号量的使用和注意事项&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 信号灯(信号量)集 POSIX 线程中的同步用的是无名信号量 进程间的同步使…

【C语言】函数递归详解(一)

目录 1.什么是递归&#xff1a; 1.1递归的思想&#xff1a; 1.2递归的限制条件&#xff1a; 2.递归举例&#xff1a; 2.1举例1&#xff1a;求n的阶乘&#xff1a; 2.1.1 分析和代码实现&#xff1a; 2.1.2图示递归过程&#xff1a; 2.2举例2&#xff1a;顺序打印一个整数的…

JS中call()、apply()、bind()改变this指向的原理

大家如果想了解改变this指向的方法&#xff0c;大家可以阅读本人的这篇改变this指向的六种方法 大家有没有想过这三种方法是如何改变this指向的&#xff1f;我们可以自己写吗&#xff1f; 答案是&#xff1a;可以自己写的 让我为大家介绍一下吧&#xff01; 1.call()方法的原理…

zabbix(2)

zabbix的自动发现机制 zabbx客户端主动和服务端联系&#xff0c;将自己的地址和端口发送服务端&#xff0c;实现自动添加监控主机 客户端是主动的一方 缺点&#xff1a;自定义网段中主机数量太多&#xff0c;登记耗时会很久&#xff0c;而且这个自动发现机制不是很稳定 zabb…

python 使用 watchdog 实现类似 Linux 中 tail -f 的功能

一、代码实现 import logging import os import threading import timefrom watchdog.events import FileSystemEventHandler from watchdog.observers import Observerlogger logging.getLogger(__name__)class LogWatcher(FileSystemEventHandler):def __init__(self, log_…

105.长度最小的子数组(力扣)|滑动窗口

代码演示 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int result INT_MAX; // 用于存储最小子数组的长度int sum 0; // 滑动窗口的长度int i 0; // 滑动窗口的起始位置int sumlength 0; // 当前子数…

Python语言基础知识(二)

文章目录 1、条件表达式2、分支结构—常见的分支结构2.1、分支结构—单分支选择结构2.2、分支结构—双分支选择结构2.3、分支结构—多分支选择结构2.4、分支结构—选择结构的嵌套 3、循环结构3.1、循环结构— for循环与while循环 1、条件表达式 在选择和循环结构中&#xff0c…

git更换远程地址

1、命令修改 git remote -v git remote set-url origin http://xxx.git git remote -v 2、工具修改

常见的性能测试缺陷有哪些?你都遇到过吗

前言 性能测试&#xff0c;是结合被测系统应用架构、业务场景和实现细节、逻辑&#xff0c;对软件响应时间、处理速率、容错能力等进行分析测试&#xff0c;找到系统的性能瓶颈&#xff0c;并确认问题得到解决的过程。 由于工作需要&#xff0c;对性能测试缺陷分类进行了整理…

PyQt6 QCalendarWidget日历控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计39条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…