当前位置: 首页 > news >正文

[1-01-01].第43节:常用类 - 比较器类 Comparator接口

Java基础学习大纲


说明:

  • 基本数据类型的数据(除boolean类型外)需要比较大小的话,之间使用比较运算符即可,
  • 引用数据类型是不能直接使用比较运算符来比较大小的。那么,如何解决这个问题呢?使用两个接口中的任何一个:ComparableComparator

Comparator接口的使用:定制排序


2.1.Comparator接口介绍:

a.适用场景:

  • 1.当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码(例如:一些第三方的类,你只有.class文件,没有源文件)
  • 2.如果一个类,实现了Comparable接口,也指定了两个对象的比较大小的规则,但是此时此刻我不想按照它预定义的方法比较大小,但是我又不能随意修改,因为会影响其他地方的使用

b.Comparator源码:

  • 1.在compare(Object o1,Object o2)方法,比较的是两个对象o1和o2的大小,若返回整数,o1大,返回0一样大,返回-1是O2大
package java.util;
public interface Comparator{int compare(Object o1,Object o2);
}

2.2.Comparator接口介绍:

  • JDK在设计类库之初,也考虑到上面所说的情况,所以又增加了一个java.util.Comparator接口,强行对多个对象进行整体排序的比较
  • 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2
  • 可以将 Comparator 传递给 sort 方法如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制
    在这里插入图片描述

2.3.代码测试:

a.测试1:把字符串从大到小的顺序排列:

public void test3(){String []arr = new String[]{"aa","ff","cc","bb","gg","zz"};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("传入的参数异常.数据类型不一致");}});//输出arr
}

b.测试2:自定义类实现按照商品名从小到大,再按照价格从高到低的顺序排列:

@Test
public void test4(){Good [] arr = new Good[4];arr[0] = new Good("klk",1.2f);arr[1] = new Good("jf",2.2f);arr[2] = new Good("trgr",0.2f);arr[3] = new Good("gryt",11.2f);Arrays.sort(arr,new Comparator(){@Overridepublic int compare(Object o1, Object o2) {if(o1 instanceof Good && o2 instanceof Good){Good g1 = (Good) o1;Good g2 = (Good) o2;if (g1.getName().equals(g2.getName())){return - Double.compare(g1.getPrice(),g2.getPrice());}else{return g1.getName().compareTo(g2.getName());}}throw  new RuntimeException("参数异常");}});System.out.println(Arrays.toString(arr));
}

三、对比两种方式:

在这里插入图片描述

http://www.dtcms.com/a/282064.html

相关文章:

  • 【DataWhale】快乐学习大模型 | 202507,Task02笔记
  • Grok 系列大模型:xAI 的智能宇宙探秘
  • web前端用MVP模式搭建项目
  • DNS防护实战:用ipset自动拦截异常解析与群联AI云防护集成
  • 用PyTorch手写透视变换
  • 【unitrix】 6.4 类型化数特征(t_number.rs)
  • Rust 基础大纲
  • AI产品经理面试宝典第27天:AI+农业精准养殖与智能决策相关面试题解答指导
  • 疗愈之手的智慧觉醒:Deepoc具身智能如何重塑按摩机器人的触觉神经
  • mongoDB集群
  • Jmeter+ant+jenkins接口自动化测试框架
  • 汽车功能安全-相关项集成和测试(系统集成测试系统合格性测试)-12
  • LabVIEW液压机智能监控
  • 【游戏引擎之路】登神长阶(十九):3D物理引擎——岁不寒,无以知松柏;事不难,无以知君子
  • WSL2更新后Ubuntu 24.04打不开(终端卡住,没有输出)
  • 模型上下文协议(MCP)的工作流程、安全威胁与未来发展方向
  • 海康线扫相机通过采集卡的取图设置
  • 作业06-文本工单调优
  • UE5 相机后处理材质与动态参数修改
  • 图机器学习(8)——经典监督图嵌入算法
  • (笔记+作业)第五期书生大模型实战营---L1G3000 LMDeploy 高效部署量化实践
  • spring容器的bean是单例还是多例的?线程安全吗?
  • 智慧公厕系统打造洁净、安全的公共空间
  • PyTorch 参数初始化详解:从理论到实践
  • 使用EF Core修改数据:Update方法与SaveChanges的深度解析
  • 【一文解决】块级元素,行内元素,行内块元素
  • 多目标优化|HKELM混合核极限学习机+NSGAII算法工艺参数优化、工程设计优化,四目标(最大化输出y1、最小化输出y2,y3,y4),Matlab完整源码
  • 自启动策略调研
  • 【前端】Vue3 前端项目实现动态显示当前系统时间
  • C++11迭代器改进:深入理解std::begin、std::end、std::next与std::prev