Java接口实现排序
创始人
2025-05-29 07:24:41

一、排序需求

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

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

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

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

二、用法

需要将哪个类排序,就让哪个类实现接口ComparableT写类名

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

1、以按年龄排序为例: 

import java.util.Arrays;
class Student implements Comparable{ //实现了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{ //年龄比较器@Overridepublic int compare(Student o1, Student o2) { //重写方法return o1.age - o2.age;}
}

 分数比较器:

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

姓名首字母比较器: 

class NameComparator implements Comparator{ //姓名首字母比较器@Overridepublic 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);}
}

相关内容

热门资讯

秦国书同文车同轨 秦国之前的文... 还不知道:七国文字的读者,下面趣历史小编就为大家带来详细介绍,接着往下看吧~秦国的统一,不仅仅是地域...
古代一千年前就有出租车了 古人... 今天趣历史小编给大家准备了:古代的出租车的文章,感兴趣的小伙伴们快来看看吧!古代的马车就和现代的汽车...
宋朝著名的“乌台诗... 今天趣历史小编就给大家带来苏轼的故事,希望能对大家有所帮助。宋神宗元丰二年(1079),在这一年,宋...
药师提醒:这些用药习惯赶紧改   胶囊掰开吃、果汁送药、跟风囤药?错错错!  药师提醒:这些用药习惯赶紧改胶囊较轻且无法立即溶解,...
福清多所学校课间延长至15分钟   14日,记者获悉,本学期起,福清市崇文小学、三山中心小学等福清多所中小学将课间活动时间从原来的1...