• java 17 -7 TreeSet元素排序规则的案例


      TreeSet:能够对元素按照某种规则进行排序。
      排序有两种方式
        A:自然排序
        B:比较器排序

      TreeSet集合的特点:排序和唯一

      通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。

     1 package zl_TreeSet;
     2 
     3 import java.util.TreeSet;
     4 public class TreeSetDemo {
     5 
     6 public static void main(String[] args) {
     7 //创建TreeSet集合
     8 TreeSet<String> tree = new TreeSet<String>();
     9 
    10 //添加元素 自然排序
    11 tree.add("bac");
    12 tree.add("cba");
    13 tree.add("a");
    14 tree.add("u");
    15 tree.add("bca");
    16 tree.add("b");
    17 tree.add("p");
    18 tree.add("");
    19 tree.add("F");
    20 
    21 //遍历 
    22 for(String s : tree){
    23 System.out.println(s);
    24 // F,a,b,bac,bca,cba,p,u 字符串的话,自然排序是按照ASCII表的顺序,第一位相同,看第二位
    25 }
    26 System.out.println("---------");
    27 
    28 TreeSet<Integer> tree1 = new TreeSet<Integer>();
    29 
    30 tree1.add(14);
    31 tree1.add(34);
    32 tree1.add(41);
    33 tree1.add(16);
    34 tree1.add(23);
    35 tree1.add(45);
    36 tree1.add(41);
    37 tree1.add(23);
    38 
    39 for(Integer i : tree1){
    40 System.out.println(i);
    41 //int类型直接按照数字顺序排序
    42 }
    43 
    44 }
    45 
    46 }

      用StreeSet集合存储自定义对象并遍历。

      如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口

      创建TreeSet集合,添加动物对象,按照以下规则进行排序:
        品种名字长度短的在前面

      因为只有一个主要的条件,而如果就根据这个写自然排序的话,那么长度一样的对象,只会添加进去一个
      所以,要增加次要条件:
        a:长度一样的,判断动物的颜色是否一样
        b:前两者一样,再判断年龄是否一样
      以上都是自然排序

    首先看对象类:

     1 package zl_TreeSet;
     2 
     3 public class Animal implements Comparable<Animal>{
     4     
     5     private String name;
     6     private String color;
     7     private int age;
     8     public Animal() {
     9         super();
    10         // TODO Auto-generated constructor stub
    11     }
    12     public Animal(String name, String color, int age) {
    13         super();
    14         this.name = name;
    15         this.color = color;
    16         this.age = age;
    17     }
    18     public String getName() {
    19         return name;
    20     }
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24     public String getColor() {
    25         return color;
    26     }
    27     public void setColor(String color) {
    28         this.color = color;
    29     }
    30     public int getAge() {
    31         return age;
    32     }
    33     public void setAge(int age) {
    34         this.age = age;
    35     }
    36     /*
    37           A:品种名字长度短的在前面
    38      
    39          因为只有一个主要的条件,而如果就根据这个写自然排序的话,那么长度一样的对象,只会添加进去一个
    40          所以,要增加次要条件:
    41          a:长度一样的,判断动物的颜色是否一样
    42          b:前两者一样,再判断年龄是否一样
    43      */
    44     public int compareTo(Animal a) {
    45         
    46         //品种名字长度短的在前面
    47         int num = this.name.length() - a.name.length();
    48         
    49         //长度相同了,要看名字的内容是否相同
    50         int num2 = num == 0 ? this.name.compareTo(a.name):num;
    51         
    52         //长度和内容都相等了,并不代表颜色相同
    53         int num3 = num2 == 0 ? this.color.compareTo(a.color) : num2;
    54         
    55         //上面都相同了,不代表年龄相同
    56         int num4 = num3 == 0? this.age - a.age : num3;
    57         
    58         //得到最终的排序结论
    59         return num4 ;
    60         
    61     }
    62     
    63     
    64 }

    测试类:

     1 package zl_TreeSet;
     2 
     3 public class Animal implements Comparable<Animal>{
     4     
     5     private String name;
     6     private String color;
     7     private int age;
     8     public Animal() {
     9         super();
    10         // TODO Auto-generated constructor stub
    11     }
    12     public Animal(String name, String color, int age) {
    13         super();
    14         this.name = name;
    15         this.color = color;
    16         this.age = age;
    17     }
    18     public String getName() {
    19         return name;
    20     }
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24     public String getColor() {
    25         return color;
    26     }
    27     public void setColor(String color) {
    28         this.color = color;
    29     }
    30     public int getAge() {
    31         return age;
    32     }
    33     public void setAge(int age) {
    34         this.age = age;
    35     }
    36     /*
    37           A:品种名字长度短的在前面
    38      
    39          因为只有一个主要的条件,而如果就根据这个写自然排序的话,那么长度一样的对象,只会添加进去一个
    40          所以,要增加次要条件:
    41          a:长度一样的,判断动物的颜色是否一样
    42          b:前两者一样,再判断年龄是否一样
    43      */
    44     public int compareTo(Animal a) {
    45         
    46         //品种名字长度短的在前面
    47         int num = this.name.length() - a.name.length();
    48         
    49         //长度相同了,要看名字的内容是否相同
    50         int num2 = num == 0 ? this.name.compareTo(a.name):num;
    51         
    52         //长度和内容都相等了,并不代表颜色相同
    53         int num3 = num2 == 0 ? this.color.compareTo(a.color) : num2;
    54         
    55         //上面都相同了,不代表年龄相同
    56         int num4 = num3 == 0? this.age - a.age : num3;
    57         
    58         //得到最终的排序结论
    59         return num4 ;
    60         
    61     }
    62     
    63     
    64     
    65 }
    何事都只需坚持.. 难? 维熟尔。 LZL的自学历程...只需坚持
  • 相关阅读:
    BigDecimal 的用法
    奇葩问题:Invalid bound statement (not found): cn.zss.zsdemo.mapper.RoleMapper.selectByPrimaryKey
    论文速览:MFQE 2.0: A New Approach for Multi-frame Quality Enhancement on Compressed Video
    博文目录
    【DEBUG】ImportError: No module named 'pygal'
    反直觉的三门问题
    一些卷积概念和图解
    MATLAB随手记
    Python3随手记
    论文写作随手记
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5903904.html
Copyright © 2020-2023  润新知