欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Java中Collections.sort對List排序的兩種方法

 更新時間:2021年12月03日 09:54:48   作者:wxx614817  
本文介紹了Java中Collections.sort對List排序的兩種方法以及Comparable 與Comparator區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、Collections.sort的簡單使用

說到List的排序,第一反應(yīng)當(dāng)然是使用Collections.sort,方便簡單。下面實現(xiàn)一下~~

 private void sortStrings() {
  List<String> list = new ArrayList<String>();
  list.add("ccc");
  list.add("aaa");
  list.add("bbb");
  //排序
  Collections.sort(list);
  //輸出
  Log.d(TAG, "-----------對字符串排序-----------");
  for(String item : list) {
   Log.d(TAG, item.toString());
  }
 }

=02-03 10:32:25.821: D/wxx(4732): -----------對字符串排序-----------
02-03 10:32:25.821: D/wxx(4732): aaa
02-03 10:32:25.821: D/wxx(4732): bbb
02-03 10:32:25.821: D/wxx(4732): ccc

可見,實現(xiàn)了對List<String>的排序,非常簡單。

二、問題提出

但在我們的項目中列表List的元素類型經(jīng)常是自定義的,下面自定義了一個實體類Person:

public class Person {
 
 private String name;
 private int age;
 
 public Person(String name, int age) {
  this.name = name;
  this.age = age;
 }
}

然后,想對Person的列表List<Person>進(jìn)行排序,首先想到的也是通過Collections.sort進(jìn)行排序:

 private void sortPerson() {
  Person p1 = new Person("ccc", 20);
  Person p2 = new Person("aaa", 18);
  Person p3 = new Person("bbb", 16);
  
  List<Person> list = new ArrayList<Person>();
  list.add(p1);
  list.add(p2);
  list.add(p3);
  
  //排序
  Collections.sort(list);
 }

發(fā)現(xiàn),代碼直接報錯了:

Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<Person>). The inferred type Person is not a valid substitute for the bounded
?parameter <T extends Comparable<? super T>>

從上面可知,Person不是一個有效的參數(shù)類型,而應(yīng)該extends Comparable。為什么?
原來,要排序嘛當(dāng)然要有排序的規(guī)則,比如按身高從高到低,按年齡從小到大,等等,也就是要有比較。而String這個對象已經(jīng)幫我們實現(xiàn)了Comparable接口,所以String類型自己就是可以比較的。而我們的Person如果想要排序,也必須能夠按某種規(guī)則進(jìn)行比較,也就是要實現(xiàn)一個比較器。我們可以通過實現(xiàn)Comparable或Comparator接口實現(xiàn)比較器 。

三、Comparable實現(xiàn)排序

Comparable實現(xiàn)比較器,是定義在Person類的內(nèi)部的,所以實體類Person需要implements Comparable<Person>,然后重寫compareTo方法,在此方法里實現(xiàn)比較規(guī)則,規(guī)則就是先比較名字,如果名字不一樣則返回比較結(jié)果,如果名字一樣,再比較年齡,返回比較結(jié)果:

public class Person implements Comparable<Person> {
 
 public String name;
 public int age;
 
 public Person(String name, int age) {
  this.name = name;
  this.age = age;
 }
 
 public int compareTo(Person another) {
  int i = name.compareTo(another.name); //比較名字字符串
  if (i == 0) { //如果名字一樣,則繼續(xù)比較年齡
   return age - another.age;
  } else { //首先比較名字,名字不一樣,則返回比較結(jié)果
   return i;
  }
 }
}

后面就是對List<Person>進(jìn)行排序并輸出:

 private void sortByComparable() {
  Person p1 = new Person("bbb", 20);
  Person p2 = new Person("aaa", 18);
  Person p3 = new Person("bbb", 16);
  
  List<Person> list = new ArrayList<Person>();
  list.add(p1);
  list.add(p2);
  list.add(p3);
  
  //排序
  Collections.sort(list);
  //輸出
  Log.d(TAG, "-----------使用Comparable實現(xiàn)的排序-----------");
  for(Person item : list) {
   Log.d(TAG, "name = "+item.name+", age = "+item.age);
  }
 }

檢查輸出結(jié)果是否正確:

02-03 12:05:31.356: D/wxx(9936): -----------使用Comparable實現(xiàn)的排序-----------
02-03 12:05:31.356: D/wxx(9936): name = aaa, age = 18
02-03 12:05:31.356: D/wxx(9936): name = bbb, age = 16
02-03 12:05:31.356: D/wxx(9936): name = bbb, age = 20

四、Comparator實現(xiàn)排序

Comparator實現(xiàn)比較器,是定義在Person類的外部的,因此實體類Person不需要做任何變化,如下:

public class Person {
 
 public String name;
 public int age;
 
 public Person(String name, int age) {
  this.name = name;
  this.age = age;
 }
}


我們的比較器My Comparator的實現(xiàn),主要是覆蓋compare方法,在這個方法內(nèi)實現(xiàn)比較的規(guī)則,具體代碼:

 public class MyComparator implements Comparator<Person> {
 
  public int compare(Person one, Person two) {
   int i = one.name.compareTo(two.name); //比較名字字符串
   if (i == 0) { //如果名字一樣,則繼續(xù)比較年齡
    return one.age - two.age;
   } else { //首先比較名字,名字不一樣,則返回比較結(jié)果
    return i;
   }
  }
  
 }

上面的排序規(guī)則是:先比較name值進(jìn)行排序,如果name值一樣 ,再比較age值排序。

最后,當(dāng)然是用我們的比較器對List<Person>進(jìn)行排序:

 private void sortByComparator() {
  Person p1 = new Person("bbb", 20);
  Person p2 = new Person("aaa", 18);
  Person p3 = new Person("bbb", 16);
  
  List<Person> list = new ArrayList<Person>();
  list.add(p1);
  list.add(p2);
  list.add(p3);
  
  //排序
  Collections.sort(list, new MyComparator());
  //輸出
  Log.d(TAG, "-----------使用Comparator實現(xiàn)的排序-----------");
  for(Person item : list) {
   Log.d(TAG, "name = "+item.name+", age = "+item.age);
  }
 }

查看排序后的輸出結(jié)果是否正確:

02-03 11:51:34.996: D/wxx(1355): -----------使用Comparator實現(xiàn)的排序-----------
02-03 11:51:34.996: D/wxx(1355): name = aaa, age = 18
02-03 11:51:35.001: D/wxx(1355): name = bbb, age = 16
02-03 11:51:35.001: D/wxx(1355): name = bbb, age = 20

五、Comparable 與Comparator區(qū)別

上面已經(jīng)分別實現(xiàn)了Comparable 與Comparator對List進(jìn)行排序,他們有相似的地方,也有不同的地方:

1)Comparable 與Comparator都是java的接口,用來對自定義的實體對象進(jìn)行比較;

2)Comparable 是定義在實體類內(nèi)部的,所以實體類對象本身就有比較大小的可能。但如果想換一種比較規(guī)則,如先按年齡后按名字排序,那么就必須修改實體類Person本身;

3)Comparator是在實體類外部實現(xiàn)比較器的,所以對List排序時必須同時傳入數(shù)據(jù)和比較器,如Collections.sort(list, new MyComparator());如果想換一種比較規(guī)則,則僅需要修改比較器MyComparator,而實體類Person則不需要改變;所以建議使用這種方法;

4)Comparable實現(xiàn)代碼相對簡單,Comparator實現(xiàn)代碼相對復(fù)雜一點,但還是建議使用Comparator方法。

到此這篇關(guān)于淺談Java中Collections.sort對List排序的兩種方法的文章就介紹到這了,更多相關(guān)Java中Collections.sort List排序 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Flowable?ReceiveTask使用場景分析

    Flowable?ReceiveTask使用場景分析

    這篇文章主要為大家介紹了Flowable?ReceiveTask使用場景分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Java原子類中的AtomicInteger類詳解

    Java原子類中的AtomicInteger類詳解

    這篇文章主要介紹了Java原子類中的AtomicInteger類詳解,原子類可以保證對"變量"操作的,原子性、有序性、可見性,我們可以通過AtomicInteger類,來看看它們是怎樣工作的,需要的朋友可以參考下
    2023-10-10
  • Java正則表達(dá)式——group方法的使用

    Java正則表達(dá)式——group方法的使用

    這篇文章主要介紹了Java正則表達(dá)式group方法的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Mybatis關(guān)聯(lián)查詢結(jié)果集對象嵌套的具體使用

    Mybatis關(guān)聯(lián)查詢結(jié)果集對象嵌套的具體使用

    在查詢時經(jīng)常出現(xiàn)一對多”的關(guān)系,所有會出現(xiàn)嵌套對象的情況,本文主要介紹了Mybatis關(guān)聯(lián)查詢結(jié)果集對象嵌套的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • IDEA中打jar包的2種方式(Maven打jar包)

    IDEA中打jar包的2種方式(Maven打jar包)

    這篇文章主要給大家介紹了關(guān)于IDEA中打jar包的2種方式,分別是不使用Maven直接打Jar包與使用Maven打jar包的兩種方法,需要的朋友可以參考下
    2021-05-05
  • SpringBoot調(diào)用對方webService接口的幾種方法示例

    SpringBoot調(diào)用對方webService接口的幾種方法示例

    平常我們開發(fā)調(diào)用接口一般會用到幾種數(shù)據(jù)格式,比如有restful的,這個是目前最流行的,也是最簡單開發(fā)的,還有一種就是webservice數(shù)據(jù)格式,本文給大家介紹了幾種SpringBoot調(diào)用對方webService接口的方法,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • SpringBoot之返回json數(shù)據(jù)的實現(xiàn)方法

    SpringBoot之返回json數(shù)據(jù)的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot之返回json數(shù)據(jù)的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java實現(xiàn)FIFO、LRU、LFU、OPT頁面置換算法

    Java實現(xiàn)FIFO、LRU、LFU、OPT頁面置換算法

    本文主要介紹了Java實現(xiàn)FIFO、LRU、LFU、OPT頁面置換算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例詳解

    jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例詳解

    這篇文章主要介紹了jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例代碼,包括配置類、請求攔截器、線程上下文等相關(guān)知識,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • java高并發(fā)之理解進(jìn)程和線程

    java高并發(fā)之理解進(jìn)程和線程

    這篇文章主要給大家介紹了關(guān)于java高并發(fā)進(jìn)程和線程的內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10

最新評論