使用Guava的ComparisonChain實現自定義的排序

FrankYou發表於2018-10-08

 可以看到使用比較器前,先要寫一個實體類,還要實現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)

 

相關文章