目录
Comparable
此接口对实现它的每个类的对象强加一个总排序。 这种排序被称为类的自然顺序 ,类的compareto方法被称为其自然比较方法
-
自然排序Compareable的使用
-
用TreeSet集合存储自定义的对象,无参构造方法使用的是自然排序对元素进行排序的。
-
自然排序,就是让元素所属的类实现Compareable接口,重写compareTo(T o)方法
-
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写。
-
-
案例:存储学生对象并遍历,创建TreeSet集合使用无参构造方法,按年龄大小排序,年龄相同时看名字是否相同,不相同的话按照姓名字母的顺序进行排序,否则剔除该元素。
-
这里出现了异常,意思是类StudentA不能转换为Compareable类型的类,这时,就需要让StudentA实现Compareable接口,并重写compareTo方法。
-
在这里需要对return的返回值进行处理,使得满足要求
这里的处理,将本对象与上一个对象进行比较结果赋值给num,并且若num==0?,也就是两个人的年龄是否相同,相同的话去比较名字,否则将num赋值给num1最后将num1返回。
-
最后的测试,名字不同,年龄相同的人。名字,年龄都相同的人。
Comparator比较器
比较函数,它对某些对象集合施加总排序 。 可以将比较器传递给排序方法(例如Collections.sort或Arrays.sort),以便精确控制排序顺序。
-
比较器Comparator的使用
-
用TreeSet集合存储自定义的对象,带参构造方法使用的是比较器排序的方法对元素进行排序的
-
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写Compare(T o1,T o2)方法
-
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
-
-
在这里直接使用TreeSet的带参构造器,其中在参数中定义匿名内部类Comparator<StudentA>,并重写了Comparator接口的Compare方法,其中的两个参数就是在Comparable自然排序中使用的this.age-s.age。在这里通过get方法调用属性,其余不变。依然能得到我们想要的结果。
-
在这里要求输入一个学生的成绩包括语文成绩,数学成绩,并对总成绩进行排序。
TreeSet<StudentA> stu = new TreeSet<>(new Comparator<StudentA>() {//匿名内部类 @Override public int compare(StudentA s1, StudentA s2) { int num=s2.getSum()-s1.getSum();//总分的比较 int num2=num==0?s2.getChineseScore()-s1.getChineseScore():num;//两科成绩是否相同的比较 int num3=num2==0?s1.getName().compareTo(s2.getName()):num2;//名字是否相同的比较 return num3; } }); StudentA s1 = new StudentA("张三",90,89); StudentA s2 = new StudentA("李四",99,95); StudentA s3 = new StudentA("王五",90,97); StudentA s4 = new StudentA("小明",99,98); // 名字不同分数相同也能写入TreeSet中 StudentA s5 = new StudentA("小五",99,98); stu.add(s1); stu.add(s2); stu.add(s3); stu.add(s4); stu.add(s5); for (StudentA studentA : stu) { System.out.println(studentA.getName()+" 语文:"+studentA.getChineseScore()+" 数学:"+studentA.getMath()+" 总分:"+studentA.getSum()); }
-
结果
-