JavaSE-15.2.2【自然排序Comparable的使用】

  1 package day6.lesson2;
  2 
  3 import java.util.TreeSet;
  4 
  5 /*
  6 2.2 自然排序Comparable的使用
  7 
  8     案例:
  9         存储学生对象并遍历,创建TreeSet集合使用无参构造方法
 10     要求:
 11         按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
 12     实现:
 13         用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
 14         自然排序,就是让元素所属的类实现Comparable接口,重写compareTo()方法
 15         重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
 16  */
 17 public class TreeSetDemo2 {
 18     public static void main(String[] args) {
 19         TreeSet<Student> ts = new TreeSet<>();
 20 
 21         Student s1 = new Student("lisi", 22);
 22         Student s2 = new Student("wang", 25);
 23         Student s3 = new Student("sun", 23);
 24         Student s4 = new Student("sun", 23);
 25         Student s5 = new Student("amy", 23);
 26 
 27         //Student类实现Comparable接口前:
 28         /*//day6.lesson2.Student cannot be cast to java.lang.Comparable
 29         ts.add(s1); //类转换异常
 30         ts.add(s2);
 31         ts.add(s3);
 32         ts.add(s4);
 33         ts.add(s5);
 34         //Comparable接口对实现它的类的对象强加一个整体排序,称为类的自然排序,类的compareTo()称为其自然比较方法
 35         //为啥报异常?因为Student未实现Comparable接口*/
 36 
 37         //Student类实现Comparable接口后:
 38         /*ts.add(s1); //ok但不完全ok
 39         ts.add(s2);
 40         ts.add(s3);
 41         ts.add(s4);
 42         ts.add(s5);
 43         //lisi,22
 44         //为啥ts只存储了第一个元素呢?
 45         //因为Student类未重写Comparable接口的compareTo()
 46         //而compareTo()默认return0,意思是比较相等元素重复
 47         //所以只添加了第一个元素,后边的都认为与第一个相同*/
 48 
 49         //Student类重写compareTo()后:
 50         ts.add(s1); //ok
 51         ts.add(s2);
 52         ts.add(s3);
 53         ts.add(s4);
 54         ts.add(s5);
 55 
 56         /*
 57         return 1; //升序
 58         lisi,22
 59         wang,25
 60         sun,23
 61         sun,23
 62          */
 63 
 64         /*
 65         return -1; //降序
 66         sun,23
 67         sun,23
 68         wang,25
 69         lisi,22
 70          */
 71 
 72         /*
 73         自定义:按照年龄升序
 74         lisi,22
 75         sun,23
 76         wang,25
 77          */
 78 
 79         //注意,s4年龄同s3年龄,返回0,故s4未存入
 80 
 81         /*
 82         自定义:按照年龄降序
 83         wang,25
 84         sun,23
 85         lisi,22
 86          */
 87 
 88         /*
 89         自定义:先年龄升序,年龄相同时按照姓名的字母顺序排序
 90         lisi,22
 91         amy,23
 92         sun,23
 93         wang,25
 94          */
 95 
 96         for(Student s: ts){
 97             System.out.println(s.getName() + "," + s.getAge());
 98         }
 99     }
100 }
 1 package day6.lesson2;
 2 
 3 public class Student implements Comparable<Student>{
 4 
 5     private String name;
 6     private int age;
 7 
 8     public Student() {
 9     }
10 
11     public Student(String name, int age) {
12         this.name = name;
13         this.age = age;
14     }
15 
16     public void setName(String name) {
17         this.name = name;
18     }
19 
20     public void setAge(int age) {
21         this.age = age;
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public int getAge() {
29         return age;
30     }
31 
32     @Override
33     public int compareTo(Student s) {
34 //        return 0; //默认 (说明比较相等,则元素重复)
35 
36         //重写
37 //        return 1; //升序
38 //        return -1; //降序
39 
40         //自定义:按照年龄升序
41         /*int num = this.age - s.age; //this-->s2  s-->s1
42         return num;*/
43 
44         //自定义:按照年龄降序
45         /*int num = s.age - this.age;
46         return num;*/
47 
48         //自定义:先年龄升序,年龄相同时按照姓名的字母顺序排序
49         int num = this.age - s.age;
50         int num2 = ( num == 0 ? this.name.compareTo(s.name) : num );
51         //String类也实现了Comparable接口,所以其内部已重写compareTo(),可直接调用
52         return num2;
53     }
54 
55 }

 

posted @ 2021-06-01 13:19  yub4by  阅读(54)  评论(0编辑  收藏  举报