• 使用Guava的ComparisonChain实现自定义的排序


     可以看到使用比较器前,先要写一个实体类,还要实现comparable接口,实现compareTo方法。这个方法一般会返回-1 0 1三个int类型数字,分别表示,对象和传入的对象比较,排序应该在传入的对象之后。因为比较器通常是为了集合排序而实现的。

    ComparisonChain 的好处就在于,可以用method().method().这样的链式比较,而不用if else这种可读性很差的面向过程的方式去判断大小。比较链的用法是当第一个compare没有比出大小时,转向第二个属性进行比较,如果第二个也没有比较出大小,转向第三个属性进行比较。。以此类推,一般来说前几个属性足够比较了,不会比到最后一个属性。

    package comparable;
    
    import com.google.common.collect.ComparisonChain;
    import lombok.Data;
    
    import java.util.*;
    
    /**
     * @author xfyou
     * @date 2018/9/30
     */
    @Data
    public class Course implements Comparable<Course> {
    
        /**
         * 学号
         */
        private String studentNumber;
    
        /**
         * 姓名
         */
        private String studentName;
    
        /**
         * 分数
         */
        private int score;
    
        @Override
        public int compareTo(Course course) {
            return ComparisonChain.start()
                    .compare(course.score, this.score)
                    .compare(this.studentNumber, course.studentNumber)
                    .result();
        }
    
        public static void main(String[] args) {
            TreeSet<Course> coursesSet = new TreeSet<>();
    
            Course course3 = new Course();
            course3.setScore(95);
            course3.setStudentName("Smith");
            course3.setStudentNumber("1003");
            coursesSet.add(course3);
    
            Course course1 = new Course();
            course1.setScore(90);
            course1.setStudentName("Frank");
            course1.setStudentNumber("1110");
            coursesSet.add(course1);
    
            Course course2 = new Course();
            course2.setScore(90);
            course2.setStudentName("Tom");
            course2.setStudentNumber("0002");
            coursesSet.add(course2);
    
            // 编译时使用iterator实现
            for (Course course : coursesSet) {
                System.out.println(course);
            }
        }
    
    }

    按照分数由大到小,分数相同的情况下按照学号由小到大来排序。运行结果如下:

    Course(studentNumber=1003, studentName=Smith, score=95)
    Course(studentNumber=0002, studentName=Tom, score=90)
    Course(studentNumber=1110, studentName=Frank, score=90)
  • 相关阅读:
    关于网络字节序(network byte order)和主机字节序(host byte order)
    关于垃圾回收,我来解释下为什么LocalConnection可以实现垃圾回收
    解决Form中ExternalInterface的Bug问题
    AS3里var aa:String是null还是""?
    IE并发连接限制(as)
    tar
    mysql默认端口号3306
    flex经验
    这个游戏不错
    nginx介绍
  • 原文地址:https://www.cnblogs.com/frankyou/p/9752865.html
Copyright © 2020-2023  润新知