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 }