使用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)

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15898.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论