1. 程式人生 > 實用技巧 >還是java牛逼,一行程式碼搞定各種排序

還是java牛逼,一行程式碼搞定各種排序

排序大家都經常用的吧,下面是個學生類,2 個欄位:id[學號],score[分數],

public class Stu {
    //編號
    private Integer id;
    //分數
    private Integer score;

    public Stu(Integer id, Integer score) {
        this.id = id;
        this.score = score;
    }

    // getter、setter大家自己補上

    @Override
    public String toString() {
        
return "Stu{" + "id=" + id + ", score=" + score + '}'; } }

來個集合,放幾個學生進去

List<Stu> stuList = new ArrayList<>();
stuList.add(new Stu(2, 30));
stuList.add(new Stu(1, 30));
stuList.add(new Stu(3, 50));
stuList.add(new Stu(4, 40));

需求:score desc,id asc

對 stuList 中的學生資訊進行排序,然後輸出結果,用 java 實現特別的簡單,2 行程式碼搞定,如下:

stuList.stream().sorted(Comparator.comparing(Stu::getScore).reversed().thenComparing(Stu::getId)).forEach(System.out::println);
Stu{id=3, score=50}
Stu{id=4, score=40}
Stu{id=1, score=30}
Stu{id=2, score=30}

是不是特別簡單,這裡使用到了 java 中的 stream 來操作的,stream 中有個 sorted 方法,需傳入比較器:Comparator,我們傳入的是:

Comparator.comparing(Stu::getScore).reversed().thenComparing(Stu::getId)。

解釋一下程式碼

Comparator.comparing(Stu::getScore) 得到score升序比較器
Comparator.comparing(Stu::getScore).reversed():將score升序比較器反轉,那麼就得到score降序比較器
Comparator.comparing(Stu::getScore).reversed().thenComparing(Stu::getId):注意這裡面用到了thenComparing,這個表示前面的比較器得到的結果相同的時候,走thenComparing函式中指定的比較方式,即按照Stu中的id升序排序。