Java中Collections.sort()排序方法舉例詳解
1.介紹
Collections.sort()方法的參數(shù)為一個List集合,用于給集合進行排序。
Collections.sort()內(nèi)部進行了方法重載,可以只傳入一個List集合參數(shù),也可以傳入一個List集合參數(shù)和一個Comparator接口對象并實現(xiàn)其中的compare方法
2.Comparator接口下的compare方法
升序排列
public static void main(String[] args) { Integer[] nums = new Integer[]{3, 7, 9, 2, 1}; Arrays.sort(nums, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); for (Integer i : nums) { System.out.print(i + " "); // 1 2 3 7 9 } }
降序排列
public static void main(String[] args) { Integer[] nums = new Integer[]{3, 7, 9, 2, 1}; Arrays.sort(nums, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); for (Integer i : nums) { System.out.print(i + " ");9 7 3 2 1 } }
所以更多時候我們是直接記住了compare(int o1, int o2)方法 return o1 - o2 是升序,return o2 - o1 是降序。為什么會這樣寫呢?我們不妨看一下sort(T[] a, Comparator<? super T> c)方法
public static <T> void sort(T[] a, Comparator<? super T> c) { if (c == null) { sort(a); } else { if (LegacyMergeSort.userRequested) legacyMergeSort(a, c); else TimSort.sort(a, 0, a.length, c, null, 0, 0); } }
可以看出他是進去了else內(nèi),不妨先進入legacyMergeSort看一下
private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) { T[] aux = a.clone(); if (c==null) mergeSort(aux, a, 0, a.length, 0); else mergeSort(aux, a, 0, a.length, 0, c); }
這里很明顯也是進去了else內(nèi),繼續(xù)看mergeSort
private static void mergeSort(Object[] src,Object[] dest,int low, int high, int off,Comparator c) { int length = high - low; // Insertion sort on smallest arrays if (length < INSERTIONSORT_THRESHOLD) { for (int i=low; i<high; i++) for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--) swap(dest, j, j-1); return; } // Recursively sort halves of dest into src int destLow = low; int destHigh = high; low += off; high += off; int mid = (low + high) >>> 1; mergeSort(dest, src, low, mid, -off, c); mergeSort(dest, src, mid, high, -off, c); // If list is already sorted, just copy from src to dest. This is an // optimization that results in faster sorts for nearly ordered lists. if (c.compare(src[mid-1], src[mid]) <= 0) { System.arraycopy(src, low, dest, destLow, length); return; } // Merge sorted halves (now in src) into dest for(int i = destLow, p = low, q = mid; i < destHigh; i++) { if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0) dest[i] = src[p++]; else dest[i] = src[q++]; } }
這一段的代碼關(guān)鍵就是如下部分
if (length < INSERTIONSORT_THRESHOLD) { for (int i=low; i<high; i++) for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--) swap(dest, j, j-1); return; }
可以看到這里面調(diào)用了compare方法,當方法的返回值大于0的時候就將數(shù)組的前一個數(shù)和后一個數(shù)做交換。以升序為例來講解,升序的話compare方法就 return o1 - o2,那么就是 return dest[j-1] - dest[j]。
當 dest[j-1] > dest[j] 時,就進行交換。當 dest[j-1] <= dest[j] 時位置不變,從而達到數(shù)組升序。降序也是一樣的道理。
補充:使用Collections.sort() 方法排序泛型對象集合
使用該方法可以進行排序泛型對象集合。如下圖定義了一個Student的類:
這個是Student的構(gòu)造方法,定義了一個userName、add、year、number、參數(shù)的類型可以通過構(gòu)造方法看出。
聲明一個List ,利用構(gòu)造方法實例化一些對象。根據(jù)對象的一些屬性進行排序。比如根據(jù)number進行排序
生成的倒敘結(jié)果:
也可以通過改變比較器的if()條件,來控制排序結(jié)果,也可以用Collections.reverse()來進行反轉(zhuǎn)。
總結(jié)
到此這篇關(guān)于Java中Collections.sort()方法舉例詳解的文章就介紹到這了,更多相關(guān)Java Collections.sort()方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java.util.Collections類—emptyList()方法的使用
- 淺談Java中Collections.sort對List排序的兩種方法
- Java使用Collections.sort()排序的方法
- java安全之CommonsCollections4詳解
- Java中的Collections類的使用示例詳解
- Java中Collections.sort的使用
- Java的可變參數(shù)與Collections類的功能示例解析
- Java中Collection與Collections的區(qū)別詳解
- Java Collection和Collections的區(qū)別
- Java中的集合工具類Collections詳解
- Java中Collection和Collections的區(qū)別
相關(guān)文章
Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標點輸入無效的完美解決方法
Mac OS X 下基于 Java 的程序會出現(xiàn)中文標點輸入無效的問題,在中文輸入法狀態(tài),可以輸入中文字,但輸入中文標點最后上去的是英文標點.這篇文章主要介紹了Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標點輸入無效的完美解決方法,需要的朋友可以參考下2016-10-10Java自定義類數(shù)組報null的相關(guān)問題及解決
這篇文章主要介紹了Java自定義類數(shù)組報null的相關(guān)問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09一篇文章帶你了解Java Spring基礎(chǔ)與IOC
這篇文章主要介紹了Java Spring基礎(chǔ)與IOC,文中講解的相關(guān)內(nèi)容非常詳細,也運用了大量的代碼進行講解,感興趣的小伙伴可以參考一下2021-08-08java正則表達式表單驗證類工具類(驗證郵箱、手機號碼、qq號碼等)
這篇文章主要介紹了java使用正則表達式進行表單驗證工具類,可以驗證郵箱、手機號碼、qq號碼等方法,需要的朋友可以參考下2014-04-04java算法題解LeetCode35復(fù)雜鏈表的復(fù)制實例
這篇文章主要為大家介紹了java算法題解LeetCode35復(fù)雜鏈表的復(fù)制實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01MyBatis-Plus 批量插入數(shù)據(jù)的操作方法
spring boot+mybatis plus環(huán)境,單條插入用的是BaseMapper自帶的insert方法,本文重點給大家介紹MyBatis-Plus 批量插入數(shù)據(jù)的操作方法,感興趣的朋友一起看看吧2021-09-09