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

Java中Collections.sort()排序方法舉例詳解

 更新時(shí)間:2024年02月28日 11:02:30   作者:JalenG  
很多時(shí)候都需要對(duì)一些數(shù)據(jù)進(jìn)行排序的操作,這篇文章主要給大家介紹了關(guān)于Java中Collections.sort()方法舉例詳解的相關(guān)資料,使用Collections.sort()可以使用其sort()方法來(lái)對(duì)List、Set等集合進(jìn)行排序,需要的朋友可以參考下

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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot攔截器不生效的問(wèn)題解決

    SpringBoot攔截器不生效的問(wèn)題解決

    很多開發(fā)者會(huì)遇到一個(gè)常見的問(wèn)題,攔截器配置了卻不生效,本文主要介紹了SpringBoot攔截器不生效的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • 一文掌握J(rèn)ava的工具類和API

    一文掌握J(rèn)ava的工具類和API

    在Java中,工具類通常包含一系列靜態(tài)方法,用于執(zhí)行常見的任務(wù),這些任務(wù)可能不直接關(guān)聯(lián)到特定的業(yè)務(wù)邏輯,而是用于處理一些基礎(chǔ)的數(shù)據(jù)轉(zhuǎn)換、字符串操作、文件操作等,這篇文章主要介紹了一文搞懂Java的工具類和API,需要的朋友可以參考下
    2008-01-01
  • Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標(biāo)點(diǎn)輸入無(wú)效的完美解決方法

    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-10
  • Java自定義類數(shù)組報(bào)null的相關(guān)問(wèn)題及解決

    Java自定義類數(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

    這篇文章主要介紹了Java Spring基礎(chǔ)與IOC,文中講解的相關(guān)內(nèi)容非常詳細(xì),也運(yùn)用了大量的代碼進(jìn)行講解,感興趣的小伙伴可以參考一下
    2021-08-08
  • java正則表達(dá)式表單驗(yàn)證類工具類(驗(yàn)證郵箱、手機(jī)號(hào)碼、qq號(hào)碼等)

    java正則表達(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-04
  • Java使用Swagger接口框架方法詳解

    Java使用Swagger接口框架方法詳解

    這篇文章主要介紹了Java使用Swagger接口框架方法,Swagger是一個(gè)方便我們更好的編寫API文檔的框架,而且Swagger可以模擬http請(qǐng)求調(diào)用,感興趣的同學(xué)可以參考下文
    2023-05-05
  • java算法題解LeetCode35復(fù)雜鏈表的復(fù)制實(shí)例

    java算法題解LeetCode35復(fù)雜鏈表的復(fù)制實(shí)例

    這篇文章主要為大家介紹了java算法題解LeetCode35復(fù)雜鏈表的復(fù)制實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Spring入門實(shí)戰(zhàn)之Profile詳解

    Spring入門實(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-02
  • MyBatis-Plus 批量插入數(shù)據(jù)的操作方法

    MyBatis-Plus 批量插入數(shù)據(jù)的操作方法

    spring boot+mybatis plus環(huán)境,單條插入用的是BaseMapper自帶的insert方法,本文重點(diǎn)給大家介紹MyBatis-Plus 批量插入數(shù)據(jù)的操作方法,感興趣的朋友一起看看吧
    2021-09-09

最新評(píng)論