【Java】重写compareTo()方法给对象数组排序

简介: 【Java】重写compareTo()方法给对象数组排序

我们先给一个数组排序,我们肯定用的是Arrays.sort()方法:

public class test2 {
    public static void main(String[] args) {
        int[] arr={3,5,4,6,9,8,1};
        System.out.println(Arrays.toString(arr));
        System.out.println("---------");
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

这样我们就实现了对这个数组的排序。

但是我们现在又有另外一个需求:

class  Student{
    public  String name;
    public  int age;
    public  int score;
    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }
}
 
Student[] students=new Student[4];
        students[0]=new Student("zhangsan",10,19);
        students[1]=new Student("lisi",8,78);
        students[2]=new Student("wangwu",15,57);
        students[3]=new Student("zhaoliu",11,57);

这里定义了一个Student数组,数组大小为4,也就是说数组中有4个学生,然后分别实例化了4个学生,把他们的名字年龄和成绩都输入了进去,现在我们想以年龄或成绩进行排序,那应该怎么实现呢,还是用Arrays.sort()方法吗?我们可以试一下:

当我们把这个数组进行排序时,报错了,报了一个类型转换异常

我们进入这个第二行报的错,显示源码中第320行报错:源码中这几段代码的意思是取到数组中的某个值,把这个值转化为了一个Comparable类型(这个Comparable是一个接口),然后调用一个compareTo()方法。

可是我们现在学生类型和这个接口类型没有什么关系,所以会报错。那怎么让他可以转换呢,我们可以让这个类实现这个接口,这个接口有一个compareTo()方法,所以我们要重写这个compareTo()方法。

那么我们总结一下:实现了comparable接口的这些类,我们就可以使用Arrays.sort()来进行一个排序。如果没有实现comparable接口直接用Arrays.sort()来进行排序的话,那他是没办法帮你排序的。但是我们做了规定,如果你想排序的话,那么我们就实现comparable接口。然后再重写里面的compareTo()方法,然后在compareTo()方法里面就可以根据你自定义的一个逻辑来进行排序。

然后我们来看一下完整的代码,要求对4个学生的年龄大小进行排序:

package csdn;
 
import java.util.Arrays;
 
class  Student implements Comparable<Student> {
    public  String name;
    public  int age;
    public  int score;
    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
    @Override
    public int compareTo(Student o) {  //重写compareTo方法
        if (this.age>o.age){         //根据年龄大小进行排序
            return  9;
        }else if (this.age<o.age){
            return  -1;
        }else {
            return  0;
        }
    }
 
}
public class test {
    public static void main(String[] args) {
        Student[] students=new Student[4];
        students[0]=new Student("zhangsan",10,19);
        students[1]=new Student("lisi",8,78);
        students[2]=new Student("wangwu",15,57);
        students[3]=new Student("zhaoliu",11,57);
        Arrays.sort(students);
        System.out.println(Arrays.toString(students));
    }
}

sort 方法中会自动调用 compareTo 方法 . compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象 .

然后比较当前对象和参数对象的大小关系:

       如果当前对象应排在参数对象之前 , 返回小于 0 的数字 ;

       如果当前对象应排在参数对象之后 , 返回大于 0 的数字 ;

       如果当前对象和参数对象不分先后 , 返回 0;

再次执行程序 , 结果就符合预期了 .

这里输出的结果就是按照学生年龄的大小来排序的。

目录
相关文章
|
6月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
859 157
|
6月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
424 18
|
6月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
290 4
|
6月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
390 5
|
7月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
227 11
|
7月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
8月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
8月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
614 0
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
308 1
下一篇
开通oss服务