【Java 基础】25 比较器

文章目录

    • 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> {@Overridepublic 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;}@Overridepublic 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.hqwc.cn/news/259211.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3dMax vs Cinema4d哪个更好更适合你?

Cinema 4d和3dMax的区别 用于游戏风格、开发和风格可视化的3D建模、动画和渲染软件系统&#xff0c;为用户提供制作和编辑动画、视觉效果和环境的灵活性。4D CINEMA可能是由MAXON构建的强大的3D建模、运动图形、绘画和动画软件系统。Cinema 4D将在每个Windows和MAC操作系统上运…

DeepIn,UOS统信专业版安装运行Java,JavaFx程序

因为要适配国产统信UOS系统&#xff0c;要求JavaFx程序能简便双击运行&#xff0c;由于网上UOS开发相关文章少&#xff0c;多数文章没用&#xff0c;因此花了不少时间&#xff0c;踩了不少坑&#xff0c;下面记录一些遇到的问题&#xff0c;我的程序环境是jdk1.8&#xff0c;为…

信息解码(Message Decoding, ACM/ICPC World Finals 1991, UVa 213)

考虑下面的01串序列&#xff1a; 0, 00, 01, 10, 000, 001, 010, 011, 100, 101, 110, 0000, 0001, …, 1101, 1110, 00000, … 首先是长度为1的串&#xff0c;然后是长度为2的串&#xff0c;依此类推。如果看成二进制&#xff0c;相同长度的后 一个串等于前一个串加1。注意上述…

2023 开发人员生态系统现状信息图:《开发者生态系统现状报告》

本心、输入输出、结果 文章目录 2023 开发人员生态系统现状信息图&#xff1a;《开发者生态系统现状报告》前言目录细节软件开发者薪资趋势过去 3 年科技行业的性别分布 生成式 AI 服务的复杂格局开发者社区的心理健康花有重开日&#xff0c;人无再少年实践是检验真理的唯一标准…

SpringBoot Seata 死锁问题排查

现象描述&#xff1a;Spring Boot项目&#xff0c;启动的时候卡住了&#xff0c;一直卡在那里不动&#xff0c;没有报错&#xff0c;也没有日志输出 但是&#xff0c;奇怪的是&#xff0c;本地可以正常启动 好吧&#xff0c;姑且先不深究为什么本地可以启动而部署到服务器上就无…

深入了解数据库锁:类型、应用和最佳实践

目录 1. 引言 2. 数据库锁的基本概念 2.1 悲观锁和乐观锁 2.2 排他锁和共享锁 3. 悲观锁的应用场景 3.1 长事务和大事务 3.2 并发修改 3.3 数据库死锁 4. 悲观锁的最佳实践 4.1 精细控制锁的粒度 4.2 避免死锁 4.3 考虑乐观锁 5. 案例分析 5.1 银行系统的转账操作…

python 使用 AppiumService 类启动appium server

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类&#xff0c;可以很方便的通过该类来管理Appium服务器的启动和停止。 二、操作步骤 import osfrom appium.webdriver.appium_service import AppiumService as OriginalServerfrom libs import pathclass AppiumSer…

Zabbix补充

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

网络运维与网络安全 学习笔记2023.12.1

网络运维与网络安全 学习笔记 第三十二天 今日目标 ACL原理与类型、基本ACL配置、高级ACL配置 高级ACL之ICMP、高级ACL之telnet ACL原理与类型 项目背景 为了企业的业务安全&#xff0c;要求不同部门对服务器有不同的权限 PC1不能访问Server PC2允许访问Server 允许其他所…

[JSMSA_CTF] 2023年12月练习题 pwn

一开始没给附件&#xff0c;还以为是3个盲pwn结果&#xff0c;pwn了一晚上没出来&#xff0c;今天看已经有附件了。 pwn1 在init_0里使用mallopt(1,0) 设置global_max_fast0 任何块释放都会进入unsort在free函数里没有清理指针&#xff0c;有UAF将v6:0x100清0&#xff0c;便于…

vue3递归组件---树形组件

第一种方式&#xff0c;直接自己调用自己 Tree.vue <template><div class"tree"><div v-for"(item, index) in data" :key"item.name">每一层 {{ item.name }}<Tree v-if"item?.children?.length" :dataitem…

Remix IDE 快速开始Starknet

文章目录 一、Remix 项目二、基于Web的开发环境Remix 在线 IDE三、Starknet Remix 插件如何使用使用 Remix【重要】通过 Starknet by Example 学习一、Remix 项目 Remix 项目网站 在以太坊合约开发领域,Remix 项目享有很高的声誉,为各个级别的开发人员提供功能丰富的工具集…