Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序:Comparator)...

1. 比较器排序(定制排序)

前面我们说到的TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列。

但是如果需要实现定制排序,比如实现降序排序,则要通过比较器排序(定制排序)实现。

比较器排序是通过Comparator接口帮助的,这个接口包含一个方法int compare(T o1, T o2)方法,该方法用于比较o1和o2的大小:

  • 如果方法返回正整数,则表明o1 大于 o2
  • 如果方法返回0,则表明o1 等于 o2
  • 如果方法返回负整数,则表明o1 小于 o2

 

int compare(Object o1, Object o2) 返回一个基本类型的整型
  如果要按照升序排序
    则o1 小于o2,返回-1(负数),相等返回0,o1大于o2返回1(正数)
  如果要按照降序排序
      则o1 小于o2,返回1(正数),相等返回0,o1大于o2返回-1(负数)

 

 

2. TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)

(1)Student.java:

 1 package cn.itcast_07;
 2 
 3 public class Student {
 4     private String name;
 5     private int age;
 6 
 7     public Student() {
 8         super();
 9     }
10 
11     public Student(String name, int age) {
12         super();
13         this.name = name;
14         this.age = age;
15     }
16 
17     public String getName() {
18         return name;
19     }
20 
21     public void setName(String name) {
22         this.name = name;
23     }
24 
25     public int getAge() {
26         return age;
27     }
28 
29     public void setAge(int age) {
30         this.age = age;
31     }
32 }

(2)TreeSetDemo.java:

 1 package cn.itcast_07;
 2 
 3 import java.util.Comparator;
 4 import java.util.TreeSet;
 5 
 6 /*
 7  * 需求:请按照姓名的长度排序
 8  * 
 9  * TreeSet集合保证元素排序和唯一性的原理
10  * 唯一性:是根据比较的返回是否是0来决定。
11  * 排序:
12  *         A:自然排序(元素具备比较性)
13  *             让元素所属的类实现自然排序接口 Comparable
14  *         B:比较器排序(集合具备比较性)
15  *             让集合的构造方法接收一个比较器接口的子类对象 Comparator
16  */
17 public class TreeSetDemo {
18     public static void main(String[] args) {
19         // 创建集合对象
20         // TreeSet<Student> ts = new TreeSet<Student>(); //自然排序
21         // public TreeSet(Comparator comparator) //比较器排序
22         // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
23 
24         // 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象
25         // 而匿名内部类就可以实现这个东西
26         TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
27             @Override
28             public int compare(Student s1, Student s2) {
29                 // 姓名长度
30                 int num = s1.getName().length() - s2.getName().length();
31                 // 姓名内容
32                 int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
33                         : num;
34                 // 年龄
35                 int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
36                 return num3;
37             }
38         });
39 
40         // 创建元素
41         Student s1 = new Student("linqingxia", 27);
42         Student s2 = new Student("zhangguorong", 29);
43         Student s3 = new Student("wanglihong", 23);
44         Student s4 = new Student("linqingxia", 27);
45         Student s5 = new Student("liushishi", 22);
46         Student s6 = new Student("wuqilong", 40);
47         Student s7 = new Student("fengqingy", 22);
48         Student s8 = new Student("linqingxia", 29);
49 
50         // 添加元素
51         ts.add(s1);
52         ts.add(s2);
53         ts.add(s3);
54         ts.add(s4);
55         ts.add(s5);
56         ts.add(s6);
57         ts.add(s7);
58         ts.add(s8);
59 
60         // 遍历
61         for (Student s : ts) {
62             System.out.println(s.getName() + "---" + s.getAge());
63         }
64     }
65 }

运行结果如下:

转载于:https://www.cnblogs.com/hebao0514/p/4857841.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值