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

【JavaSE】Comparable和Comparator接口

文章目录

  • 1.前言
  • 2.Comparable接口
  • 3.Comparator接口
  • 4.总结

1.前言

在Java中引用类型是不能直接比大小的,如下:有一个学生类,一个学生数组,直接对学生数组使用 Arrays.sort进行排序 可以看到会报错

    public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student("zhangsan",14);students[1] = new Student("lisi",23);students[2] = new Student("wangwu",18);Arrays.sort(students);System.out.println(Arrays.toString(students));}

在这里插入图片描述

学生类:

public class Student{publicString name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

在 Java 里,对对象进行排序主要有两种方式:一是让对象所属的类实现Comparable接口,二是借助Comparator接口来定义比较器。接下来通过这个例子教大家Comparable接口和Comparator接口来进行排序

2.Comparable接口

若要让对象具备自然排序的能力,可使对象所属的类实现Comparable<T>接口,同时重写compareTo(T o)方法。 学生有两个属性 nameage 接下来分别使用 nameage实现排序方法
示例1- 根据年龄进行排序:

public 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() {...// toString方法这里就省略了}// 排序方法!@Overridepublic int compareTo(Student o) {return this.age - o.age;}
}

compareTo 方法返回一个整数值,该值表示当前对象(this)与另一个对象(o)的比较结果:

  • 负数:如果 this 应该排在 o 前面(即 this < o)
  • 零:如果 this 与 o 相等(即 this == o)
  • 正数:如果 this 应该排在 o 后面(即 this > o)

此时运行程序可以看到已经正常进行排序了
在这里插入图片描述
示例2- 对name进行排序:
只需要将compareTo方法改一下就可以了

    @Overridepublic int compareTo(Student o) {return this.name.compareTo(o.name);}

compareTo 方法里面是调用了 String 类的 compareTo 方法,该方法按字典序比较两个字符串

字典序规则是按照A~Z的字母顺序进行排序

此时排序就是按照name进行排序了
在这里插入图片描述

3.Comparator接口

当你需要依据不同的条件对对象进行排序,或者对象所属的类没有实现Comparable接口时,就能使用Comparator接口来定义比较器
示例1-根据age进行比较:

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

运行截图:
在这里插入图片描述
传入自定义的 ageComparator,告诉排序方法 “按年龄升序排列”

示例2-按照name排序:
同理定义一个NameComparator类

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

在比较时传入定义好的nameComparator就可以了
在这里插入图片描述

4.总结

Comparator 的作用:

  • 无需修改 Student 类,即可定义多种排序规则(如按年龄、按姓名)
  • 适用于第三方类或需要多种排序方式的场景

与 Comparable 的区别:

  • Comparable:对象自身实现,定义 “自然排序” 规则(如 Student implements Comparable)
  • Comparator:外部定义,更灵活,支持临时排序规则
http://www.lqws.cn/news/553771.html

相关文章:

  • Bootstrap 5学习教程,从入门到精通,Bootstrap 5 Flex 布局语法知识点及案例(27)
  • 华为云镜像仓库下载 selenium/standalone-chrome 镜像
  • 使用Docker安装MySQL和Nginx
  • 深入详解:随机森林算法——概念、原理、实现与应用场景
  • 8. 【Vue实战--孢子记账--Web 版开发】-- 账户账本管理
  • ESP-IDF中通过红外遥控RMT点亮WS2812(3)
  • web网页开发,在线%旅游景点管理%系统demo,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql
  • 【Docker基础】Docker容器管理:docker top及其参数详解
  • 【力扣 中等 C】79. 单词搜索
  • HarmonyOS NEXT仓颉开发语言实战案例:图片预览器
  • 东南亚 TikTok 直播网络专线,专线助力告别直播画面卡顿时代
  • 某省职业院校技能大赛 高职组“信息安全管理与评估”赛项第二部分:应急响应
  • Word之空白页删除2
  • Note2.3 机器学习:Adaptive Learning Rate
  • 顺序表的常见算法
  • Qt 收藏夹书签管理
  • Qt的UDP接收过一段时间后就收不到数据,readyRead() 信号不触发的彻底解决方法
  • Python 数据分析:numpy,抽提,整数数组索引
  • 鸿蒙5:其他布局容器
  • 【大数据】HDFS分布式 机架感知
  • 学习笔记(C++篇)—— Day 8
  • Node.js特训专栏-实战进阶:10.MongoDB文档操作与聚合框架
  • 提示词优化神奇: PromptPilot是什么
  • NLog、log4net、Serilog 和 Microsoft.Extensions.Logging 四大 .NET 日志库的综合对比
  • 滑坡监测接收机市场分析
  • Uni-App 小程序面试题高频问答汇总
  • 电子电气架构 --- 车载芯片SOC简介
  • VR训练美国服务器:高性能解决方案与优化指南
  • 淘宝客APP的性能优化与监控体系:架构师的技术实践
  • 力扣第73题-矩阵置零