1. 程式人生 > >List集合排序的實現

List集合排序的實現

list集合排序的實現

根據物件屬性進行排序
簡單說明一下:對list集合中的User進行排序,根據其姓名和年齡進行排序。直接看程式碼,User類我就不寫了

public class ListSort {

    public static void main(String[] args) {

        List<User> list = new ArrayList<>();

        list.add(new  User("zs", 24));
        list.add(new  User("ls", 26));
        list.add(new  User("ww", 20));
        list.add(new  User("jq", 25));
        list.add(new  User("hx", 19));
        list.add(new  User("ax", 19));

        System.out.println("排序前 " + list.toString());

        Collections.sort(list);
        System.out.println("排序後: " + list.toString());

    }

}

這種方法需要User類實現Comparable介面,並實現compareTo()方法,並在此方法內定義排序規則。

 //定義排序規則 根據年齡進行排序(從大到小),從小到大隻需將this.getAge()和o.getAge()調換位置即可
    @Override
    public int compareTo(User o) {
        return o.getAge() - this.getAge();
    }

如果先要按照年齡排序,然後按照姓名排序,則寫法如下:

 //定義排序規則  這裡是先比較年齡再比較姓名
    @Override
    public int compareTo(User o) {
        int i = o.getAge() - this.getAge();
        if (i == 0) {
            i = o.getName().compareTo(this.getName());
        }
        return i;
    }

簡要說明:i是int型別的返回值,1表示大於,0表示等於,-1表示小於。
列印結果如下:

在這裡插入圖片描述

這種寫法總歸還是麻煩,非要User實現Comparable介面,不太靈活。於是,有了下面的排序方法,這也是JDK1.8的新特性之一。

Lambda表示式

 list.sort(((o1, o2) -> {
            int i = o1.getAge() - o2.getAge();			//游標調到i的位置
            return i;            
        }));
        System.out.println("排序後: " + list.toString());

可以看出,這時候User不需要實現Comparable介面了。取而代之的是,把排序規則寫到了Lambda裡面。
其實在此基礎上還可以進一步簡化寫法,操作很簡單。把滑鼠游標調到i的位置,然後一直alt + enter 再回車,就行了,最後會變成如下寫法:

list.sort((Comparator.comparingInt(User::getAge)).thenComparing(User::getName));

這樣是不是更簡潔了呢。不過這樣似乎沒法倒序排序了,具體實現LZ這裡還沒有去研究,有興趣的朋友可以去試試。