使用Java如何对复杂的数据类型排序和比大小
一.对复杂的数据类型比大小
假如我们现在有个学生类,并且我们实例化出了俩个学生对象,他们各自有各自的名字和年龄属性,我们如何对他们进行比大小操作呢?
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; } @Override public 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"); } } }
我们也可以根据年龄进行比大小,只需要重新重写这个方法就可以了
@Override public 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); // } @Override public int compareTo(Student o) { return this.age-o.age; } @Override public 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方法来对复杂类型的数组进行排序
到此这篇关于使用Java如何对复杂的数据类型排序和比大小的文章就介绍到这了,更多相关Java数据类型排序和比大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java中的字符流FileReader与FileWriter详解
这篇文章主要介绍了Java中的字符流FileReader与FileWriter详解,在Java中,使用Unicode约定存储字符,字符流自动允许我们逐字符读/写数据,有助于执行16位Unicode的输入和输出,它是以reader和writer结尾的,需要的朋友可以参考下2023-10-10SpringBoot读取properties配置文件中的数据的三种方法
本文主要介绍了SpringBoot读取properties配置文件中的数据的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-06-06Java中的PrintWriter 介绍_动力节点Java学院整理
PrintWriter 是字符类型的打印输出流,它继承于Writer。接下来通过本文给大家介绍java中的 PrintWriter 相关知识,感兴趣的朋友一起学习吧2017-05-05
最新评论