246 自然排序Comparable的使用
(复杂)
【自然排序Comparable的使用】
- 存储学生对象并遍历,创建TreeSet集合使用无参构造方法
- 要求:按照年龄从大到小排序,年龄相同的按姓名字母顺序排序
【代码练习思路】
思路:创建对象、创建集合、添加元素、输出元素
按照以上思路运行,报错了,classCastException类转换异常
查看帮助文档可知,class Comparable,该接口对实现它的每一个对象强加一个整体排序,这个排序被称为类的自然排序,类的compareTo方法被称为自然比较方法
修改代码:到Student类里,实现Comparable接口,重写compareTo方法
【报错了】
明明重写了超类的方法,但是系统报编译时异常,说没有重写超类里的方法?
——先注释掉做后面的,等解答,有了解答再加上
——解答:加上泛型,implements Comparable后面加上泛型<Student246>
以后如何规避相似问题?
——仔细回看教学视频,补上漏掉的步骤
【结论】
TreeSet集合能给元素排序,且保证元素唯一性,没有重复的元素
1 package e246;
2
3 import java.util.TreeSet;
4
5 public class Demo246 {
6 public static void main(String[] args) {
7 TreeSet<Student246> willow = new TreeSet<Student246>();
8
9 Student246 s1 = new Student246("BAT",24);
10 Student246 s2 = new Student246("ZOE",29);
11 Student246 s3 = new Student246("MOLE",26);
12 Student246 s4 = new Student246("AVA",24);
13
14 willow.add(s1);
15 willow.add(s2);
16 willow.add(s3);
17 willow.add(s4);
18
19 System.out.println("---19---");
20 for (Student246 s:willow){
21 System.out.println(s.getName()+","+s.getAge());
22 }
23 //报错了!classCastException类转换异常
24 // (帮助文档)class Comparable
25 // 该接口对实现它的每一个对象强加一个整体排序,这个排序被称为类的自然排序,类的compareTo方法被称为自然比较方法
26 }
27 }
//---19---
//AVA,24
//BAT,24
//MOLE,26
//ZOE,29
--------------------------------------------------------------
1 package e246;
2
3 public class Student246 implements Comparable<Student246>{
4 private String name;
5 private int age;
6
7 public Student246() {
8 }
9
10 public Student246(String name, int age) {
11 this.name = name;
12 this.age = age;
13 }
14
15 public String getName() {
16 return name;
17 }
18
19 public void setName(String name) {
20 this.name = name;
21 }
22
23 public int getAge() {
24 return age;
25 }
26
27 public void setAge(int age) {
28 this.age = age;
29 }
30
31 @Override
32 public int compareTo(Student246 wind) {
33 return 0;
34 }
35 }
31 | @Override | ---19--- |
32 | public int compareTo(Student246 wind) { | MOLE,26 |
33 | return 0; | |
34 | } | |
//返回0,则只能添加1个元素。 //因为系统认为后面添加的和已经添加的元素是一样的, //因此不会重复添加 |
-
31 | @Override | ---19--- |
31 | @Override | MOLE,26 |
32 | public int compareTo(Student246 wind) { | RAT,24 |
33 | return 1; | TOAD,29 |
34 | } //返回1,则可以添加元素,但仍不可添加重复的 //按存储顺序输出,因为系统认为后加的元素比先加的大 | BADGER,46 |
MOLE,26 |
-
31 | @Override | ---19--- |
31 | @Override | BADGER,46 |
32 | public int compareTo(Student246 wind) { | TOAD,29 |
33 | return -1; | RAT,24 |
34 | } //返回-1,- //按存储顺序输出,因为系统认为后加的元素比先加的小 | MOLE,26 |
-
31 | @Override | ---19--- |
32 | public int compareTo(Student246 wind) { | BADGER,46 |
33 | int num = wind.age - this.age; | TOAD,29 |
34 | return num; | MOLE,26 |
35 | }//这样是年龄从大到小 | RAT,24 |
-
31 | @Override | ---19--- |
32 | public int compareTo(Student246 wind) { | RAT,24 |
33 | int num = this.age - wind.age; | MOLE,26 |
34 | return num; | TOAD,29 |
35 | }//这样是年龄从小到大 | BADGER,46 |
-
31 | @Override | ---19--- |
32 | public int compareTo(Student246 wind) { | AVA,24 |
33 | int num1 = this.age - wind.age; | RAT,24 |
34 | int num2 = num1==0?this.name.compareTo(wind.name):num1; // 两个对象年龄相同时按姓名字母顺序排序 // 为了方便查看,BADGER,46改成AVA,24,结果如右侧所示 | MOLE,26 |
35 | return num1; | TOAD,29 |
36 | } |