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

news/2024/10/22 9:26:19/

目录

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

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.ppmy.cn/news/1217784.html

相关文章

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

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

Linux 系统概述

Part I: Linux 系统概述 什么是 LinuxLinux 的历史和版本Linux 发行版介绍Linux 的优缺点 Part II: Linux 安装与配置 5. 硬件要求与准备工作 6. 安装 Linux 操作系统 7. Linux 系统初始化设置 8. Linux 系统更新与升级 9. Linux 基础配置 Part III: Linux 命令行 10. Linux…

数据结构:反射

基本概念 反射中的四个类 Class类 Java文件在被编译之后&#xff0c;生成了.class文件&#xff0c;JVM此时解读.class文件&#xff0c;将其解析为java.lang.Class 对象&#xff0c;在程序运行时每个java文件就最终变成了Class类对象的一个实例。通过反射机制应用这个 实例就…

Domino为外出Internet邮件设置DKIM签名

大家好&#xff0c;才是真的好。 如果你看了上篇《Domino中和邮件安全有关的SPF、DKIM介绍》内容&#xff0c;想必就对DKIM概念不陌生&#xff0c;当然&#xff0c;上篇我们讲的是邮件入站的SFP、DKIM签名检查&#xff0c;这篇讲述的是外出邮件的DKIM签名。 是的&#xff0c;…

LoadRunner Error -26377: No match found for the requested parameter 获取参数的方法要前置

web_reg_save_param("access_token","LBaccess_token\":\"", //获取返回参数左右边界值时&#xff1a;有"双引号时,需要使用\来进行转义"RB\",","SearchBody",LAST);web_reg_save_param("token_type&q…

【python 生成器 面试必备】yield关键字,协程必知必会系列文章--自己控制程序调度,体验做上帝的感觉 3完结

In this article we’ll see how we can close generators and throw exceptions to generators. If you want to know what is a generator, sending values to generator, you can look at part I and part II of the yield series respectively. 这篇文章我们讲学习close 生…

nginx安装搭建

下载 免费开源版的官方网站&#xff1a;nginx news Nginx 有 Windows 版本和 Linux 版本&#xff0c;但更推荐在 Linux 下使用 Nginx&#xff1b; 下载nginx-1.14.2.tar.gz的源代码文件&#xff1a;wget http://nginx.org/download/nginx-1.14.2.tar.gz 我的习惯&#xff0…

3. 【自动驾驶和机器人中的SLAM技术】实现基于预积分和图优化的GNSS+IMU+Odom的融合定位系统

目录 1. 公式推导2. GNSSIMUOdom融合定位3. 利用数值求导工具&#xff0c;验证本书实验中的雅可比矩阵的正确性4. 也欢迎大家来我公众号读书--“过千帆” 1. 公式推导 2. GNSSIMUOdom融合定位 程序实现以及运行效果&#xff1a; ①首先是在预积分程序中记录了预积分积累的IMU数…