246 自然排序Comparable的使用

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

}

おすすめ

転載: blog.csdn.net/m0_63673788/article/details/121464326