Java14常用类4:Java比较器

5.Java比较器

基本数据类型的数据(除Boolean类型外)需要比较大小的话,使用比较运算符即可,但是引用数据类型不能直接使用比较运算符来比较大小。

  • Java中经常涉及到对象数组的排序问题,对此Java有 2种方式实现对象的排序:
  • Comparable 自然排序
  • Comparator 定制排序

5.1 自然排序: 实现Comparable接口

java.lang.Comparable
实现步骤:
① 由具体的类A 去实现 Comparable接口;
② 重写 Comparable接口中的 compareTo(Object obj)方法,在此方法中指明 比较类A的对象的 大小标准;
③ 创建类A的多个实例,进行大小的比较 或排序。

5.1.1 比较String引用类型

@Testpublic void test1() {String[] arr = new String[]{"Tom","Jerry", "Tony", "Jack", "Lucy",};Arrays.sort(arr);for (String name : arr) {System.out.println(name);}}

5.1.2 比较具体对象

package com.lCommonClasses.hComparator;/*** 商品*/
public class Product implements Comparable{private String name;//商品名private double price;//价格public Product() {}public Product(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Product{" +"name='" + name + '\'' +", price=" + price +'}';}/*** 当前类需要实现 Comparable中的抽象方法 compareTo(Object o)* 在此方法中,需要指明如何判断当前类的大小。如:按照价格的高低进行大小的比较* (从小到大),价格相等时按照商品名称进行比较。* @param o* @return num:①num>0:当前对象大; ②num< 0:当前对象小; ③num= 0: 两个对象相等*/@Overridepublic int compareTo(Object o) {if (o == this){return 0;}if (o instanceof Product){Product p= (Product) o;int value = Double.compare(this.price, p.getPrice());if (value !=0){return -value;}return this.name.compareTo(p.name);}//手动抛出一个异常类的对象throw new RuntimeException("类型不匹配");}
}
package com.lCommonClasses.hComparator;import org.junit.Test;import java.util.Arrays;/*** 对象比较,方式一*/
public class Comparable1 {/*1. 排序2. 比较的标准:先比价格(从大到小);价格相同,再比名字(从小到大)。*/@Testpublic void test2() {Product[] arr = new Product[5];arr[0] = new Product("Hua", 7500);arr[1] = new Product("Mi", 6500);arr[2] = new Product("Honor", 6500);arr[3] = new Product("Iphone", 9500);arr[4] = new Product("Viv", 4500);Arrays.sort(arr);//排序后遍历for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}//比大小@Testpublic void test3() {Product p1 = new Product("Hua", 7500);Product p2 = new Product("Honor", 6500);int compare = p1.compareTo(p2);if (compare > 0) {System.out.println("p1 > p2");} else if (compare < 0) {System.out.println("p2 < p1");} else {System.out.println("p1 = p2");}}
}

5.2 定制排序: java.util.Comparator

  • 思考:
  1. 当元素的类型没有实现 java.long.Comparable接口而又不方便修改代码(例如:一些第三方的类,只有 .class文件,没有源文件);
  2. 如果一个类实现了Comparable接口,也指定了两个对象比较大小的规则,但此时不想按照预定的方法比较大小,但是又不能随意修改( 因为可能影响其他地方的使用),怎么做?
  • JDK设计类库之初,也考虑到这种情况,所以又增加了一个 java.util.Comparator接口。强行对多个对象进行整体排序的比较
  1. 重写 compare(Object o1, Object o2)方法,比较它们的大小:返回值 > 0, o1 > o2;返回值 < 0, o1 < o2;返回值 = 0, o1 = o2;
  2. 可以将 Comparator传递给 sort方法(如:Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制

java.lang.Comparator
实现步骤:
① 创建了一个实现 了 Comparable接口的实现类 A;
② 实现类 A要求重写 Comparable接口中的抽象方法 compareTo(Object o1, Object o2),在此方法中指明 比较类A的对象的 大小标准;(A类在此指: String类,或Product类)
③ 创建此实现类A的对象,并将此对象传入到相关方法的参数位置即可。(比如:Arrays.sort(…, 类A的实例))

5.2.1 String 降序排列

@Testpublic void test2() {String[] arr = new String[]{"Tom","Jerry", "Tony", "Jack", "Lucy",};Arrays.sort(arr,new Comparator(){@Overridepublic int compare(Object o1, Object o2) {if (o1 instanceof String && o2 instanceof String) {String s1 = (String) o1;String s2 = (String) o2;//降序排列return -s1.compareTo(s2);}throw new RuntimeException("类型不匹配");}});//排序后遍历for (String name : arr) {System.out.println(name);}}

5.2.2 对象排序

    @Testpublic void test1() {Product[] arr = new Product[5];arr[0] = new Product("Hua", 7500);arr[1] = new Product("Mi", 6500);arr[2] = new Product("Honor", 6500);arr[3] = new Product("Iphone", 9500);arr[4] = new Product("Viv", 4500);//创建一个实现了 Comparator接口的实现类的对象Comparator comparator = new Comparator() {/*如果判断两个对象 o1、02 的大小,其标准就是此方法的需要编写的逻辑。如:先比价格(从大到小);价格相同,再比名字(从小到大)。*/@Overridepublic int compare(Object o1, Object o2) {if (o1 instanceof Product && o2 instanceof Product){Product p1 = (Product) o1;Product p2 = (Product) o2;//比价格(从大到小)
//                    return -Double.compare(p1.getPrice(),p2.getPrice());//比名字(从小到大)return p1.getName().compareTo(p2.getName());}throw new RuntimeException("类型不匹配");}};Arrays.sort(arr,comparator);//排序后遍历for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}

5.3 两种比较器的对比

1)角度一:

  • 自然排序:单一的、唯一的
  • 定制排序:灵活的、多样的

2)角度二:

  • 自然排序:一劳永逸
  • 定制排序:临时的

3)角度三:细节

  • 自然排序:对应的接口是Comparable,对应的抽象方法compareTo( Object obj);
  • 定制排序:对应的接口是Comparator,对应的抽象方法compareTo( Object obj1, Object obj2);

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

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

相关文章

Qt5 基于OpenGL实现六轴机械臂三维仿真

需求 在Qt中通过OPenGL方式加载三维模型STL文件&#xff0c;然后将多个结构的STL文件类型的模型进行组装&#xff0c;形成6轴机械臂三维模型的显示&#xff0c;并且可以对每个关节进行关节角度的控制。 新建一个C类STLFileLoader&#xff0c;用于加载STL文件&#xff0c;并进…

IP协议(2) 和 数据链路层协议基础

IP协议续 1.路由选择 在复杂的网络结构中,我们需要找到一个通往终点的路线,这就是路由选择 举个例子:我们在没有手机导航之前,想去一个地方得是到一个地方问一下路的方式最终找到目的地 路由的过程,其实就是样子问路的过程 1.当IP数据包到达路由器的时候,会查看目的IP 2.路由器…

Jmeter高级使用

文章目录 JMeter之计数器JMeter之集合点JMeter之断言JMeter之动态关联后置处理器&#xff1a;正则表达式提取器 JMeter之分布式测试JMeter之组件执行顺序元件的作用域元件的执行顺序配置元件Http Cookie管理器 多协议接口的性能测试Debug采样器Http请求中文乱码的解决Post参数设…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起…

Java_简单模拟实现ArrayList_学习ArrayList

文章目录 一、 了解线性表和顺序表区别1.线性表2.顺序表 二、模拟实现1.定义接口2.定义MyArrayList3.成员变量以及构造方法4.实现打印数组5.实现add方法6.实现查找某个数是否存在contains或者某个数的下标indexOf7.获取或更改pos位置的值 get和set8.获取数组大小 size9.删除某个…

Git版本管理工具(实战进阶):零基础到起飞实战项目完整篇 →Git学习一篇就够 从基本指令、到本地仓库、远程仓库、实战项目开发演练介绍超详细!

heima 李师傅最新版 Git的讲解 文章目录 Git在实战项目开发使用功能学习01.Git 初识02.Git 仓库03.Git 的三个区域04.Git 文件状态05.Git 暂存区作用06.练习-登录页面07.Git-切换版本08.删除文件09.忽略文件10.分支的概念11.练习-登录 bug 修复12.分支-合并与删除13.分支-合并与…

循环神经网络RNN专题(01/6)

一、说明 RNN用于处理序列数据。在传统的神经网络模型中&#xff0c;是从输入层到隐含层再到输出层&#xff0c;层与层之间是全连接的&#xff0c;每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如&#xff0c;你要预测句子的下一个单词是什么&a…

【演讲比赛流程管理系统(C++版)】

一、演讲比赛程序需求 1.1、比赛规则 学校举行一场演讲比赛&#xff0c;共有12个人参加。比赛共两轮&#xff0c;第一轮为淘汰赛&#xff0c;第二轮为决赛 每名选手都有对应的编号&#xff0c;如10001~10012 比赛方式:分组比赛&#xff0c;每组6个人 第一轮分为两个小组&a…

【深度测试】如何分析脚本以及对脚本进行测试

线上会存在一种任务&#xff0c;定时或者手动出发&#xff0c;我们称之为“脚本”&#xff0c;也可以称之为“job” 一、脚本的特性 无过程&#xff1a;只有开始和结束&#xff0c;过程迅速且黑盒。无交互&#xff1a;脚本处理的业务场景都几乎没有交互&#xff0c;只有数据被…

国产 四通道时间数字转换器 MS1050NA

国产 四通道时间数字转换器 MS1050NA 产品简述&#xff1a; MS1050NA 是一款高性能的时间数字转换器&#xff0c;内 置4 个测量通道。 MS1050NA 具有 CMOS 输入和串行 SPI 输出&#xff0c;具有高测量性能和高数据传输量。MS1050NA具有灵活的配置以及无限的测量范围&#xff0c…

算法篇之二分

二分算法简介 特点 最简单的一种算法&#xff0c;也是最恶心&#xff0c;细节最多&#xff0c;最容易写出死循环的算法时间复杂度O(logN) 如何学习 明白其中的算法原理&#xff0c;二分并不是只有数组有序的的时候使用&#xff0c;而是看是否具有二段性。模板 朴素的二分模…

TCP TIME_WAIT 过多怎么处理

文章目录 1.什么是 TCP TIME_WAIT&#xff1f;2.为什么要 TIME_WAIT?3.TIME_WAIT 过多的影响4.解决办法4.1 调整短连接为长连接4.2 调整系统内核参数 5.小结参考文献 1.什么是 TCP TIME_WAIT&#xff1f; TCP 断开连接四次挥手过程中&#xff0c;主动断开连接的一方&#xff…

BeanFactory创建过程(基于Servlet)

BeanFactory创建过程&#xff08;基于Servlet&#xff09; 1. 概述1.2 那么问题就来了1.2.1 谁负责AnnotationConfigServletWebServerApplicationContext实例呢&#xff1f;1.2.2 ApplicationContextFactory初始化过程又是怎么样的&#xff1f; 1.3 总结 2. 最后 1. 概述 Anno…

什么可以用手机蓝牙控制LED???#串口通信【下】

什么可以用手机蓝牙控制LED&#xff1f;&#xff1f;&#xff1f;#串口通信【下】 前言预备知识1.小白玩串口控制的ASSII避坑1.1问题引入1.2解决问题 2.串口支持单词型指令控制2.1实现串口支持单词型指令控制的核心思路2.2利用字符数组来承接单词型指令2.3利用strstr函数来查找…

【Time Series】LSTM代码实战

一、简介 还是那句话&#xff0c;"时间序列金融"是一个很有"钱"景的话题&#xff0c;还是想尝试采用Stock时间序列预测任务DeepLearning。本文提供了LSTM预测股票的源代码。 二、算法原理 长短期记忆网络&#xff08;LSTM&#xff09;是一种特殊的循环神经…

如何衡量代码的复杂度

圈复杂度概要 最近的培训中了解到了一个概念&#xff0c;叫做圈复杂度。 圈复杂度&#xff08;Cyclomatic Complexity&#xff09;是一种衡量程序复杂度的度量方法。它由美国计算机科学家 Thomas J. McCabe 在 1976 年提出。圈复杂度通过统计程序的控制流图中的决策结构&…

linux有关安全的几个基本配置,禁止root登录,新建root权限账号

一、不安装多余的软件&#xff0c;能最小化安装就不要安装图形化界面&#xff0c;然后根据需求安装需要的软件。 二、防火墙要启用&#xff0c;如果您的这台服务器对外有服务只要放开服务就好了&#xff0c;就是说白了白名单&#xff0c;切忌一上来第一件事儿就是关闭防火墙&a…

C. Did We Get Everything Covered?

给你两个整数 n 和 k 以及一个字符串 s 。 您的任务是检查是否所有长度为 n 的字符串都可以用前 k 个小写英文字母组成&#xff0c;并作为 s 的子序列出现。如果答案是否定的&#xff0c;那么您还需要打印一个长度为 n 的字符串&#xff0c;该字符串可以用前 k 个小写英文字母组…

Mobileye CES 2024 自动驾驶新技术新方向

Mobileye亮相2024年国际消费类电子产品展览会推出什么自动驾驶新技术? Mobileye再次亮相CES&#xff0c;展示了我们的最新技术&#xff0c;并推出了Mobileye DXP--我们全新的驾驶体验平台。 与往年一样&#xff0c;Mobileye是拉斯维加斯展会现场的一大亮点&#xff0c;让参观…

一文读懂Prodigal教程

2.prodigal教程 2.1 介绍 Prodigal 由橡树岭国家实验室和田纳西大学诺克斯维尔分校于2007年在能源部联合基因组研究所的主持下联合开发&#xff0c;是一种用于细菌和古细菌基因组的蛋白质编码基因预测软件工具&#xff0c;Prodigal 已成为世界上最受欢迎的微生物基因预测算法…