Java中Collections.sort()排序方法舉例詳解
1.介紹
Collections.sort()方法的參數(shù)為一個(gè)List集合,用于給集合進(jìn)行排序。
Collections.sort()內(nèi)部進(jìn)行了方法重載,可以只傳入一個(gè)List集合參數(shù),也可以傳入一個(gè)List集合參數(shù)和一個(gè)Comparator接口對(duì)象并實(shí)現(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 } }
所以更多時(shí)候我們是直接記住了compare(int o1, int o2)方法 return o1 - o2 是升序,return o2 - o1 是降序。為什么會(huì)這樣寫呢?我們不妨看一下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); } }
可以看出他是進(jìn)去了else內(nèi),不妨先進(jìn)入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); }
這里很明顯也是進(jìn)去了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方法,當(dāng)方法的返回值大于0的時(shí)候就將數(shù)組的前一個(gè)數(shù)和后一個(gè)數(shù)做交換。以升序?yàn)槔齺?lái)講解,升序的話compare方法就 return o1 - o2,那么就是 return dest[j-1] - dest[j]。
當(dāng) dest[j-1] > dest[j] 時(shí),就進(jìn)行交換。當(dāng) dest[j-1] <= dest[j] 時(shí)位置不變,從而達(dá)到數(shù)組升序。降序也是一樣的道理。
補(bǔ)充:使用Collections.sort() 方法排序泛型對(duì)象集合
使用該方法可以進(jìn)行排序泛型對(duì)象集合。如下圖定義了一個(gè)Student的類:
這個(gè)是Student的構(gòu)造方法,定義了一個(gè)userName、add、year、number、參數(shù)的類型可以通過(guò)構(gòu)造方法看出。
聲明一個(gè)List ,利用構(gòu)造方法實(shí)例化一些對(duì)象。根據(jù)對(duì)象的一些屬性進(jìn)行排序。比如根據(jù)number進(jìn)行排序
生成的倒敘結(jié)果:
也可以通過(guò)改變比較器的if()條件,來(lái)控制排序結(jié)果,也可以用Collections.reverse()來(lái)進(jìn)行反轉(zhuǎn)。
總結(jié)
到此這篇關(guān)于Java中Collections.sort()方法舉例詳解的文章就介紹到這了,更多相關(guān)Java Collections.sort()方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java.util.Collections類—emptyList()方法的使用
- 淺談Java中Collections.sort對(duì)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 程序中文標(biāo)點(diǎn)輸入無(wú)效的完美解決方法
Mac OS X 下基于 Java 的程序會(huì)出現(xiàn)中文標(biāo)點(diǎn)輸入無(wú)效的問(wèn)題,在中文輸入法狀態(tài),可以輸入中文字,但輸入中文標(biāo)點(diǎn)最后上去的是英文標(biāo)點(diǎn).這篇文章主要介紹了Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標(biāo)點(diǎn)輸入無(wú)效的完美解決方法,需要的朋友可以參考下2016-10-10Java自定義類數(shù)組報(bào)null的相關(guān)問(wèn)題及解決
這篇文章主要介紹了Java自定義類數(shù)組報(bào)null的相關(guān)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09一篇文章帶你了解Java Spring基礎(chǔ)與IOC
這篇文章主要介紹了Java Spring基礎(chǔ)與IOC,文中講解的相關(guān)內(nèi)容非常詳細(xì),也運(yùn)用了大量的代碼進(jìn)行講解,感興趣的小伙伴可以參考一下2021-08-08java正則表達(dá)式表單驗(yàn)證類工具類(驗(yàn)證郵箱、手機(jī)號(hào)碼、qq號(hào)碼等)
這篇文章主要介紹了java使用正則表達(dá)式進(jìn)行表單驗(yàn)證工具類,可以驗(yàn)證郵箱、手機(jī)號(hào)碼、qq號(hào)碼等方法,需要的朋友可以參考下2014-04-04java算法題解LeetCode35復(fù)雜鏈表的復(fù)制實(shí)例
這篇文章主要為大家介紹了java算法題解LeetCode35復(fù)雜鏈表的復(fù)制實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Spring入門實(shí)戰(zhàn)之Profile詳解
什么是spring profile?簡(jiǎn)單講profile就是一組配置,不同profile提供不同組合的配置,程序運(yùn)行時(shí)可以選擇使用哪些profile來(lái)適應(yīng)環(huán)境。下面這篇文章主要介紹了Spring中Profile實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考借鑒。2017-02-02MyBatis-Plus 批量插入數(shù)據(jù)的操作方法
spring boot+mybatis plus環(huán)境,單條插入用的是BaseMapper自帶的insert方法,本文重點(diǎn)給大家介紹MyBatis-Plus 批量插入數(shù)據(jù)的操作方法,感興趣的朋友一起看看吧2021-09-09