List集合排序的實現
阿新 • • 發佈:2018-11-15
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這裡還沒有去研究,有興趣的朋友可以去試試。