• TreeSet之用外部比较器实现自定义有序(重要)


     Student.java

    package com.sxt.set5;
    
    public class Student{
        private String name;
        private int age;
        private double salary;
        public Student(String name, int age, double salary) {
            super();
            this.name = name;
            this.age = age;
            this.salary = salary;
        }
        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;
        }
        public double getSalary() {
            return salary;
        }
        public void setSalary(double salary) {
            this.salary = salary;
        }
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + ", salary=" + salary + "]";
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Student other = (Student) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            if (Double.doubleToLongBits(salary) != Double.doubleToLongBits(other.salary))
                return false;
            return true;
        }
        
    }

    SalarySortOfStudent.java

    package com.sxt.set5;
    
    import java.util.Comparator;
    
    /*
     * TreeSet:有序
     * implements Comparator<Student> 
     * 如果用外部比较器TreeSet必须是实现Comparator接口来实现有序
     * 使用泛型是为了在重写compare()方法时,object不用强制转换类型
     */
    
    //外部比较器:在新建类内重写比较规则即compare()方法
    public class SalarySortOfStudent implements Comparator<Student>{
    
        //外部比较器的自定义比较规则:按照salary排序
        @Override
        public int compare(Student o1, Student o2) {
            //double类型的比较:不能直接写成return o1.getSalary-o2.getSalary
            //因为方法重写 返回值类型为基本数据类型必须一致  所以返回double会转成int会损失精度
            if(o1.getSalary() < o2.getSalary()){//降序
                return 1;
            }else{
                return -1;//不能是0即不能返回相等 否则结果会少输出 因为Set接口是(无序,唯一)
            }
        }
        
    }

    NameSortOfStudent.java

    package com.sxt.set5;
    
    import java.util.Comparator;
    
    /*
     * 外部比较器:名字相同时 按照年龄降序输出
     * 实现Comparator  重写比较规则即compare()方法
     */
    
    
    public class NameSortOfStudent implements Comparator<Student>{
    
        @Override
        public int compare(Student stu1, Student stu2) {
            if(stu1.getName().equals(stu2.getName())){
                return stu2.getAge() - stu1.getAge();
            }
            return stu1.getName().compareTo(stu2.getName());
            //String类已经实现了Comparable接口 已经重写了compareTo()方法
        }
        
    }

    TestStudent.java

    package com.sxt.set5;
    import java.util.HashSet;
    /*
     * TreeSet 有序的 二叉树(红黑数)
     */
    import java.util.Set;
    import java.util.TreeSet;
    
    public class TestStudent {
        public static void main(String[] args) {
            //排序之比较规则
            SalarySortOfStudent ss = new SalarySortOfStudent();
            TreeSet<Student> arr = new TreeSet<>(ss);//ss:外部比较器即比较规则
            arr.add(new Student("bbb", 21, 532.2));
            arr.add(new Student("ccc", 32, 32.2));
            arr.add(new Student("ddd", 11, 352.2));
            arr.add(new Student("aaa", 15, 32.2));
            //遍历
            System.out.println("按照外部比较器按薪资降序排列:");
            for(Student s:arr){
                System.out.println(s);
            }
    //        按照外部比较器按薪资(double)降序排列 结果为:
    //        Student [name=bbb, age=21, salary=532.2]
    //        Student [name=ddd, age=11, salary=352.2]
    //        Student [name=aaa, age=15, salary=32.2]
    //        Student [name=ccc, age=32, salary=32.2]
            
            System.out.println("----------------------------------------");
            
            NameSortOfStudent ns = new NameSortOfStudent();
            TreeSet<Student> arr1 = new TreeSet<>(ns);//ns:外部比较器即比较规则
            arr1.add(new Student("bbb", 21, 532.2));
            arr1.add(new Student("ccc", 32, 32.2));
            arr1.add(new Student("aaa", 11, 352.2));
            arr1.add(new Student("aaa", 15, 32.2));
            System.out.println("按照外部比较器按名字排序(如果名字相同则按年龄降序排序):");
            for(Student s:arr1){
                System.out.println(s);
            }
    //        按照外部比较器按名字排序(如果名字相同则按年龄降序排序):
    //        Student [name=aaa, age=15, salary=32.2]
    //        Student [name=aaa, age=11, salary=352.2]
    //        Student [name=bbb, age=21, salary=532.2]
    //        Student [name=ccc, age=32, salary=32.2]
    
        }
    }
  • 相关阅读:
    eclipse乱码解决方法
    撞库攻击:一场需要用户参与的持久战
    网管把握市场需求,其实一点都不可怜 转载于 [http://tonyxiaohome.blog.51cto.com/925273/955589]
    mysql主从不同步,提示更新找不到记录
    安装完MongoDB后尝试mongod -dbpath命令为什么会一直卡在连接端口?
    mysqlslap对mysql进行压力测试
    mysqlslap: Error when connecting to server: 2001 Can't create UNIX socket (24) 解决方法
    MySQL架构
    VMWare linux 打印太多,看不到之前的记录的解决方法总结
    启动Mysql时,提示error 2002 的解决办法
  • 原文地址:https://www.cnblogs.com/qingfengzhuimeng/p/6744681.html
Copyright © 2020-2023  润新知