//录入学生成绩信息,并且将学生成绩按照大小排序将学生信息输出。publicstaticvoidmain(String[] args){
SortedSet<Students> stu=newTreeSet<>();
System.out.println("请输入你要录入学生信息总数:");
Scanner sc=newScanner(System.in);
Scanner sc1=newScanner(System.in);int num=sc.nextInt();for(int i =0; i <num; i++){
System.out.println("请输入学生姓名:");
String stuName=sc.next();
System.out.println("请输入学生总分:");float stuScore=sc1.nextInt();
Students s=newStudents(stuName,stuScore);
stu.add(s);}for(Students s:stu){
System.out.println(s);}}}classStudents{private String name;privatefloat score;public Students (String name,float score){this.name=name;this.score=score;}@Overridepublic String toString(){return"学生姓名:"+ name +" 学生成绩:"+ score ;}publicfloatgetScore(){return score;}}
当我们使用将自定义对象存储到TreeSet集合中会出现一个异常:java.lang.ClassCastException: class Students cannot be cast to class java.lang.Comparable
叫做类型转换异常:学生类型不能被转换成可比较的类型。
那么为什么那些基本类型可以进行排序,自定义的数据类型就不可以?
实际上基本类型底层实现了Comparable接口或者编写了一个Comparator比较器,用来比较元素进行排序。那我们如果要想自定义对象也进行排序,就有两种方法,一是学生类实现Comparable接口,二是单独编写一个比较器类实现Comparator接口,然后在创建TreeSet集合将比较器传入就行。
对于这两个方法我们只要取其一就可以,但是一般情况选择编写选择器比较好,因为程序设计原则就是面向接口,降低类与类之间的耦合度,编写比较器可以降低测试类与用户类的耦合度,所以优先选择。
实现接口,我们就要实现接口中的方法,虽然两个接口实现的方法不同,但是其思想是一样的。
classstuComparatorimplementsComparator{//用两个学生的成绩进行相减比较返回整形值@Overridepublicintcompare(Object o, Object t1){int num1=(int)(((Students)o).getScore()-((Students)t1).getScore());return num;}}