zoukankan      html  css  js  c++  java
  • 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 }

    运行结果如下:

  • 相关阅读:
    boost编译中的细节问题
    geos编译问题
    安装pytorch的细节记录
    Qt学习-模仿Qt实现一个colorbutton
    BOOST内存管理-intrusive_ptr
    GEOS使用记录
    matlab添加永久路径
    关于浮点数的取值范围以及精度的问题
    vs2010中使用命令行参数
    sprintf fprintf EOF scanf 的返回值 深拷贝与浅拷贝
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4857841.html
Copyright © 2011-2022 走看看