• TreeSet 比较器排序 自定义对象


    package cn.itcast.day21.treeset2;
    
    import java.util.Comparator;
    import java.util.TreeSet;
    
    /*
     * TreeSet 按照自定义对象Student的姓名长度 比较器排序
     * 
     * 自然排序or比较器排序取决于,TreeSet的构造方法 
     *     无参构造:自然排序
     *     有参构造: 比较器排序 
     * 
     * TreeSet集合保证元素排序和唯一性的原理
     * 唯一性:根据比较的返回是否是0来决定
     * 排序:
     *         A:自然排序(元素具备比较性)
     *             让元素所属的类实现自然排序接口Comparable
     *         B:比较器排序(集合具备比较性)
     *             让集合的构造方法接收一个比较器接口的子类对象Comparator
     * 
     */
    public class TreeSetDemo {
        public static void main(String[] args) {
            //创建集合对象
    //        TreeSet<Student> ts=new TreeSet<Student>();//自然排序
    //        TreeSet<Student> ts= TreeSet(Comparator comparator);//比较器排序 ---推荐使用!因为匿名内部类对其他代码的影响较小
            TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>(){
    
                @Override
                public int compare(Student o1, Student o2) {
                    int num=o1.getName().length()-o2.getName().length();
                    int num2=num==0?o1.getName().compareTo(o2.getName()):num;
                    int num3=num2==0?o1.getAge()-o2.getAge():num2;
                    return num3;
                }
            });
            //创建元素对象
            Student s1=new Student("linqingxia",27);
            Student s2=new Student("wuqilong",27);
            Student s3=new Student("wanglihong",34);
            Student s4=new Student("zhouxingchi",57);
            Student s5=new Student("linqingxia",28);
            Student s6=new Student("linqingxia",27);
            
            //添加集合元素
            ts.add(s1);
            ts.add(s2);
            ts.add(s3);
            ts.add(s4);
            ts.add(s5);
            ts.add(s6);
            
            //遍历集合 
            for(Student s:ts){
                System.out.println(s.getName()+"-----"+s.getAge());
            }
        }
    
    }
    package cn.itcast.day21.treeset2;
    
    public class Student {
        private String name;
        private int age;
        
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public Student() {
            super();
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    
    }

     

     

    自然排序和比较器排序哪个更好呢?

         建议:   如果只使用一次,建议采用匿名内部类的方式实现比较器排序。(针对集合的构造)

                        这样做的好处:当Student类发生变化时,不用修改整体比较逻辑,即不用修改自然排序依赖的compareTo()方法(元素具备的比较性)

  • 相关阅读:
    小于65535的数字编码(端口验证)
    js利用 iframe 或 a 标签连接下载文件
    vue 强制更新局部dom
    vue中js里的/* eslint-disable*/及其ESLint的介绍
    css取消双击选中文字
    Number.EPSILON
    js判断对象是否为空对象的几种方法
    python实现批量城市经纬度查询
    python基础知识之状态的储存和调用(即json和pickle)
    python基础知识之内置函数
  • 原文地址:https://www.cnblogs.com/qq-757617012/p/4287482.html
Copyright © 2020-2023  润新知