1 package day6.lesson2;
2
3 import java.util.Comparator;
4 import java.util.TreeSet;
5
6 /*
7 2.3 比较器排序Comparator的使用
8
9 案例需求
10 存储学生对象并遍历,创建TreeSet集合使用带参构造方法
11 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
12 实现步骤
13 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
14 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
15 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
16 */
17 public class TreeSetDemo3 {
18 public static void main(String[] args) {
19 // TreeSet<Student2> ts = new TreeSet<>(); //无参构造
20 //有参构造
21 TreeSet<Student2> ts = new TreeSet<>(new Comparator<Student2>() {
22 @Override
23 public int compare(Student2 s1, Student2 s2) { //类比compareTo():this-->s2 s-->s1
24 // return 0; //默认
25
26 /*return 1; //升序
27 return -1; //降序*/
28
29 //根据需求自定义比较规则
30 int num = s1.getAge() - s2.getAge();
31 int num2 = ( num == 0 ? s1.getName().compareTo(s2.getName()) : num );
32 return num2;
33 }
34 }); //匿名内部类作为有参构造的参数
35
36 Student2 s1 = new Student2("lisi", 22);
37 Student2 s2 = new Student2("wang", 25);
38 Student2 s3 = new Student2("sun", 23);
39 Student2 s4 = new Student2("sun", 23);
40 Student2 s5 = new Student2("amy", 23);
41
42 ts.add(s1);
43 ts.add(s2);
44 ts.add(s3);
45 ts.add(s4);
46 ts.add(s5);
47
48 for (Student2 s: ts){
49 System.out.println(s.getName() + "," + s.getAge());
50 }
51 /*
52 lisi,22
53 amy,23
54 sun,23
55 wang,25
56
57 该比较器排序结果(TreeSetDemo3)同自然排序结果(TreeSetDemo2)
58 前者 有参构造方法中传递一个比较器接口并重写比较规则(通过匿名内部类实现)
59 后者 Student类实现接口并重写比较规则
60 */
61 }
62 }
1 package day6.lesson2;
2
3 public class Student2 {
4 private String name;
5 private int age;
6
7 public Student2() {
8 }
9
10 public Student2(String name, int age) {
11 this.name = name;
12 this.age = age;
13 }
14
15 public void setName(String name) {
16 this.name = name;
17 }
18
19 public void setAge(int age) {
20 this.age = age;
21 }
22
23 public String getName() {
24 return name;
25 }
26
27 public int getAge() {
28 return age;
29 }
30 }