Java怎么对复杂的数据类型排序和比大小

目录

 一.对复杂的数据类型比大小

Comparable接口

compareTo方法 

二.对复杂数据类型排序

三.总结


 一.对复杂的数据类型比大小

假如我们现在有个学生类,并且我们实例化出了俩个学生对象,他们各自有各自的名字和年龄属性,我们如何对他们进行比大小操作呢?

class Student {public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}
}public class Test{public static void main(String[] args) {Student student1 = new Student("张三",20);Student student2 = new Student("李四",23);   if (student1 > student2) {System.out.println("student1 > student2");}else {System.out.println("student1 < student2");}}
}

我们可以看见编译器的报错提示,这是因为Java提供的运算符号只能识别操作简单的数据类型,对于我们自定义的Student类是无法识别的

Comparable接口

在这种情况下,我们就可以使用我们之前的讲解的接口的知识,我们可以调用Comparable接口,然后重写其中的compareTo方法,在使用接口的时候需要注意声明你需要比较的类型,也就是接口后尖括号内的内容

compareTo方法 

我们在这里对接口中的compareTo方法进行重写后,在main方法中进行调用 

class Student implements Comparable <Student> {public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Student o) {return this.name.compareTo(o.name);}
}public class Test{public static void main(String[] args) {Student student1 = new Student("张三",20);Student student2 = new Student("李四",23);if (student1.compareTo(student2) > 0) {System.out.println("student1 > student2");}else {System.out.println("student1 <= student2");}}
}

我们也可以根据年龄进行比大小,只需要重新重写这个方法就可以了

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

二.对复杂数据类型排序

假如我们现在有一个学生类数组,我们使用Arrays.sort对他进行排序

public class Test{public static void main(String[] args) {Student[] students = new Student[3];Student student1 = new Student("张三",20);Student student2 = new Student("李四",23);Student student3 = new Student("王五",25);students[0] = student1;students[1] = student2;students[2] = student3;Arrays.sort(students);}
}

我们会发现报错信息如下,原因就是对于这种复杂的数据类型,如果我们要让编译器来排序,那我们就需要给他排序规则,很显然这里编译器是没有读取到任何的排序规则的

我们点击错误信息,打开源码观察会发现,编译器这里还是用到了Comparable接口

那我们还是像刚才一样调用Comparable接口,然后我们给出明确的排序规则,再写一个排序方法,就可以正常对复杂数据排序了

import java.util.Arrays;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 int compareTo(Student o) {
//        return this.name.compareTo(o.name);
//    }@Overridepublic int compareTo(Student o) {return this.age-o.age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}public static void mySort(Comparable[] comparables) {for (int i = 0; i < comparables.length-1; i++) {for (int j = 0; j < comparables.length-1-i; j++) {//if(comparables[j] > comparables[j+1]) {if(comparables[j].compareTo(comparables[j+1]) > 0) {//交换Comparable tmp = comparables[j];comparables[j] = comparables[j+1];comparables[j+1] = tmp;}}}}
}public class Test{public static void main(String[] args) {Student[] students = new Student[3];Student student1 = new Student("张三",20);Student student2 = new Student("李四",23);Student student3 = new Student("王五",25);students[0] = student1;students[1] = student2;students[2] = student3;mySort(students);System.out.println(Arrays.toString(students));}
}

三.总结

当我们需要对复杂的数据类型进行排序或者比大小的时候,我们就可以使用Comparable接口,然后重写其中的compareTo方法,然后就可以直接使用compareTo方法进行排序了,又或者是通过其他方法来调用compareTo方法来对复杂类型的数组进行排序

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

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

相关文章

多篇论文介绍-DSConv-原文

论文地址 https://arxiv.org/pdf/1901.01928v1.pdf 目录 01 改进 YOLOv5的交通灯实时检测鲁棒算法 01 作用 02 模型介绍 02 基于改进YOLOv7一tiny 算法的输电线路螺栓缺销检测 01 作用 02 模型介绍 03 结合注意力机制的 &#xff39;&#xff2f;&#xff2c;&#xff2…

计算机服务器中了mallox勒索病毒怎么解决,勒索病毒解密,数据恢复

企业的计算机服务器为企业的数据存储提供了极大便利&#xff0c;也让企业的生产运行效率得到了极大提升&#xff0c;但是网络数据安全威胁随着技术的不断发展也不断增加。近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mallox勒索病…

黑马点评回顾 redis实现共享session

文章目录 传统session缺点整体访问流程代码实现生成验证码登录 问题具体思路 传统session缺点 传统单体项目一般是把session存入tomcat&#xff0c;但是每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat&#xff0c;并且把自己的信息存放到第一台服务器…

java实现冒泡排序

冒泡排序是一种简单的排序算法&#xff0c;以下是Java实现示例代码&#xff1a; public static void bubbleSort(int[] array) {int n array.length;for (int i 0; i < n - 1; i) {for (int j 0; j < n - i - 1; j) {// 如果前面的元素比后面的元素大&#xff0c;就交…

日常生活小技巧 -- Visual Studio Code 简单使用

讲一下 Visual Studio Code 简单使用&#xff0c;怕以后长时间不用忘记了。 资源管理器 快捷键 ctilshiftE 搜索 快捷键 ctilshiftF 全部折叠 区分大小写、全字匹配 替换、全部替换 切换搜索详细信息 例如排除.h 和 .bat文件 *.h;*.bat源代码管理 暂存更改、放弃更…

macOS文本编辑器 BBEdit 最新 for mac

BBEdit是一款功能强大的文本编辑器&#xff0c;适用于Mac操作系统。它由Bare Bones Software开发&#xff0c;旨在为开发者和写作人员提供专业级的文本编辑工具。 以下是BBEdit的一些主要特点和功能&#xff1a; 多语言支持&#xff1a;BBEdit支持多种编程语言和标记语言&…

数据可视化模板案例:制造业提高生产力的关键

一、模板背景 在这个信息爆炸的时代&#xff0c;数据对于企业的成功至关重要。制造业作为全球经济的重要组成部分&#xff0c;如何有效利用数据提高生产效率、降低成本、优化决策&#xff0c;已成为行业关注的焦点。 二、方案思路 配⾊ - 科技蓝&#xff0c;贴合⼯业主题。 …

Linux 函数库

函数库&#xff1a; 我们的C程序中&#xff0c;并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢? 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去…

OpenCV图像坐标系

绘制代码: X轴 # 选取两个点 point1 = (20, 0) point2 = (200, 0)# 在图像上绘制连接线 cv2.line(img, point1, point2, (

软考网络工程师知识点总结(四)

目录 61、FTP文件传输服务 62、DHCP动态主机配置协议 63、电子邮件服务 64、各种新技术相关概念及功能的考查 65、Windows的ipconfig命令 66、Windows的其它命令及说明 67、Linux系统关机和重启命令 68、Linux系统文件属性命令 69、SNMP协议版本 70、SNMP协议的报文类…

【Android】统一系统动画

需求&#xff1a;除panel动画效果为弹出之外&#xff0c;其余的应用效果为渐入渐出 从系统层面统一把控动画效果&#xff0c;而不是单个应用自己处理 Android系统版本&#xff1a;9.0 代码地址 \frameworks\base\core\res\res\values\styles.xml 当时看注释&#xff0c;以为…

H5游戏源码分享-超级染色体小游戏

H5游戏源码分享-超级染色体小游戏 游戏玩法 不断地扩大发展同颜色的色块 用最少的步数完成游戏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width,user-scalableno,init…