【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;
再次执行程序 , 结果就符合预期了 .

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT牛爷爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值