恕我直言你可能真的不會java第7篇:像使用SQL同樣排序集合

在開始以前,我先賣個關子提一個問題:咱們如今有一個Employee員工類。vue

@Data
@AllArgsConstructor
public class Employee {

   private Integer id;
   private Integer age;   //年齡
   private String gender;  //性別
   private String firstName;  
   private String lastName;
}

你知道怎麼對一個Employee對象組成的List集合,先按照性別字段倒序排序,再按照年齡的倒序進行排序麼?若是您不知道4行代碼之內的解決方案(實際上是1行代碼就能夠實現,但筆者格式化爲4行),我以爲您有必要一步步的看下去。
java

1、字符串List排序

cities是一個字符串數組。注意london的首字母是小寫的。spring

List<String> cities = Arrays.asList(
        "Milan",
        "london",
        "San Francisco",
        "Tokyo",
        "New Delhi"
);
System.out.println(cities);
//[Milan, london, San Francisco, Tokyo, New Delhi]

cities.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println(cities);
//[london, Milan, New Delhi, San Francisco, Tokyo]

cities.sort(Comparator.naturalOrder());
System.out.println(cities);
//[Milan, New Delhi, San Francisco, Tokyo, london]
  • 當使用sort方法,按照String.CASE_INSENSITIVE_ORDER(字母大小寫不敏感)的規則排序,結果是:[london, Milan, New Delhi, San Francisco, Tokyo]
  • 若是使用Comparator.naturalOrder()字母天然順序排序,結果是:[Milan, New Delhi, San Francisco, Tokyo, london]

一樣咱們能夠把排序器Comparator用在Stream管道流中。swift

cities.stream().sorted(Comparator.naturalOrder()).forEach(System.out::println);

//Milan
//New Delhi
//San Francisco
//Tokyo
//london

在java 7咱們是使用Collections.sort()接受一個數組參數,對數組進行排序。在java 8以後能夠直接調用集合類的sort()方法進行排序。sort()方法的參數是一個比較器Comparator接口的實現類,Comparator接口的咱們下一節再給你們介紹一下。後端

2、整數類型List排序

List<Integer> numbers = Arrays.asList(6, 2, 1, 4, 9);
System.out.println(numbers); //[6, 2, 1, 4, 9]

numbers.sort(Comparator.naturalOrder());  //天然排序
System.out.println(numbers); //[1, 2, 4, 6, 9]

numbers.sort(Comparator.reverseOrder()); //倒序排序
System.out.println(numbers);  //[9, 6, 4, 2, 1]

3、按對象字段對List<Object>排序

這個功能就比較有意思了,舉個例子你們理解一下。數組

Employee e1 = new Employee(1,23,"M","Rick","Beethovan");
Employee e2 = new Employee(2,13,"F","Martina","Hengis");
Employee e3 = new Employee(3,43,"M","Ricky","Martin");
Employee e4 = new Employee(4,26,"M","Jon","Lowman");
Employee e5 = new Employee(5,19,"F","Cristine","Maria");
Employee e6 = new Employee(6,15,"M","David","Feezor");
Employee e7 = new Employee(7,68,"F","Melissa","Roy");
Employee e8 = new Employee(8,79,"M","Alex","Gussin");
Employee e9 = new Employee(9,15,"F","Neetu","Singh");
Employee e10 = new Employee(10,45,"M","Naveen","Jain");


List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);

employees.sort(Comparator.comparing(Employee::getAge));
employees.forEach(System.out::println);
  • 首先,咱們建立了10個Employee對象,而後將它們轉換爲List
  • 而後重點的的代碼:使用了函數應用Employee::getAge做爲對象的排序字段,即便用員工的年齡做爲排序字段
  • 而後調用List的forEach方法將List排序結果打印出來,以下(固然咱們重寫了Employee的toString方法,否則打印結果沒有意義):
Employee(id=2, age=13, gender=F, firstName=Martina, lastName=Hengis)
Employee(id=6, age=15, gender=M, firstName=David, lastName=Feezor)
Employee(id=9, age=15, gender=F, firstName=Neetu, lastName=Singh)
Employee(id=5, age=19, gender=F, firstName=Cristine, lastName=Maria)
Employee(id=1, age=23, gender=M, firstName=Rick, lastName=Beethovan)
Employee(id=4, age=26, gender=M, firstName=Jon, lastName=Lowman)
Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin)
Employee(id=10, age=45, gender=M, firstName=Naveen, lastName=Jain)
Employee(id=7, age=68, gender=F, firstName=Melissa, lastName=Roy)
Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin)
  • 若是咱們但願List按照年齡age的倒序排序,就使用reversed()方法。如:
employees.sort(Comparator.comparing(Employee::getAge).reversed());

4、Comparator鏈對List<Object>排序

下面這段代碼先是按性別的倒序排序,再按照年齡的倒序排序。springboot

employees.sort(
        Comparator.comparing(Employee::getGender)
        .thenComparing(Employee::getAge)
        .reversed()
);
employees.forEach(System.out::println);

//都是正序 ,不加reversed
//都是倒序,最後面加一個reserved
//先是倒序(加reserved),而後正序
//先是正序(加reserved),而後倒序(加reserved)
細心的朋友可能注意到:咱們只用了一個reversed()倒序方法,這個和SQL的表述方式不太同樣。這個問題不太好用語言描述,建議你們去看一下 本文對應的視頻

排序結果以下:前後端分離

Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin)
Employee(id=10, age=45, gender=M, firstName=Naveen, lastName=Jain)
Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin)
Employee(id=4, age=26, gender=M, firstName=Jon, lastName=Lowman)
Employee(id=1, age=23, gender=M, firstName=Rick, lastName=Beethovan)
Employee(id=6, age=15, gender=M, firstName=David, lastName=Feezor)
Employee(id=7, age=68, gender=F, firstName=Melissa, lastName=Roy)
Employee(id=5, age=19, gender=F, firstName=Cristine, lastName=Maria)
Employee(id=9, age=15, gender=F, firstName=Neetu, lastName=Singh)
Employee(id=2, age=13, gender=F, firstName=Martina, lastName=Hengis)

歡迎關注個人博客,裏面有不少精品合集

  • 本文轉載註明出處(必須帶鏈接,不能只轉文字):字母哥博客

以爲對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創做動力! 。另外,筆者最近一段時間輸出了以下的精品內容,期待您的關注。ide

相關文章
相關標籤/搜索