Java接口实现排序

一、排序需求

当我们有一个学生类,我们属性有姓名,年龄,分数。我们想分别根据属性来将学生进行排序。

因为学生是引用类型,肯定不能这样比较:

if (student1 > student2){
    System.out.println("student1 > student2");
}

于是,我们通过接口Comparator来实现

二、用法

需要将哪个类排序,就让哪个类实现接口Comparable<T>,T写类名

然后再重写接口的compareTo(类名 o)方法

1、以按年龄排序为例: 

import java.util.Arrays;
class Student implements Comparable<Student>{ //实现了Comparable接口
    String name;
    int age;
    double score;

    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }
    @Override   //重写了Comparable接口中的compareTo方法
    public int compareTo(Student o) {
       if(this.age > o.age){
           return 1;
       } else if (this.age == o.age) {
           return 0;
       }else {
           return -1;
       }
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student("小明",18,98.3);
        students[1] = new Student("小红",17,92.1);
        students[2] = new Student("小华",19,88.3);
        Arrays.sort(students); //实现排序
        System.out.println(Arrays.toString(students));
    }
}

也可以这样重写

 @Override   //重写了Comparable接口中的compareTo方法
    public int compareTo(Student o) {
      return this.age - o.age ; //从小到大排序
    }

2、根据分数排序

在重写方法时,因为返回值是int类型的,而分数是double类型的,需要强制转换

@Override   //重写了Comparable接口中的compareTo方法
    public int compareTo(Student o) {
      return (int)(this.score - o.score) ; //因为返回值是int类型的,而分数是double类型的,需要强制转换
    }

3、根据姓名首字母排序

因为字母不能相减,因此需要用到String中自带的compareTo方法

 @Override   //重写了Comparable接口中的compareTo方法
    public int compareTo(Student o) {
      return this.name.compareTo(o.name);
    }

 三、比较器

因为一个类,实现了了Comparable接口,只能有一个重写的方法,对类的侵入性太强。

可以通过比较器来实现通过不同的属性进行排序

1、语法

写一个比较器类,实现Comparator比较器接口,重写方法

 年龄比较器:

class AgeComparator implements Comparator<Student>{ //年龄比较器
    @Override
    public int compare(Student o1, Student o2) { //重写方法
        return o1.age - o2.age;
    }
}

 分数比较器:

class ScoreComparator implements Comparator<Student>{  //分数比较器
    @Override
    public int compare(Student o1, Student o2) {
        return (int)(o1.score - o2.score);
    }
}

姓名首字母比较器: 

class NameComparator implements Comparator<Student>{ //姓名首字母比较器
    @Override
    public int compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);
    }

2、用法:实例化比较器类

public class TestDemo {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student("mo",18,98.3);
        students[1] = new Student("ll",17,92.1);
        students[2] = new Student("nn",19,88.3);
        AgeComparator ageComparator = new AgeComparator();
        Arrays.sort(students,ageComparator);
    }
}

猜你喜欢

转载自blog.csdn.net/benxiangsj/article/details/129589728