亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

相關(guān)文章

  • SpringBoot攔截器不生效的問題解決

    SpringBoot攔截器不生效的問題解決

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

    一文掌握Java的工具類和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 程序中文標點輸入無效的完美解決方法

    Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標點輸入無效的完美解決方法

    Mac OS X 下基于 Java 的程序會出現(xiàn)中文標點輸入無效的問題,在中文輸入法狀態(tài),可以輸入中文字,但輸入中文標點最后上去的是英文標點.這篇文章主要介紹了Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標點輸入無效的完美解決方法,需要的朋友可以參考下
    2016-10-10
  • Java自定義類數(shù)組報null的相關(guān)問題及解決

    Java自定義類數(shù)組報null的相關(guān)問題及解決

    這篇文章主要介紹了Java自定義類數(shù)組報null的相關(guān)問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 一篇文章帶你了解Java Spring基礎(chǔ)與IOC

    一篇文章帶你了解Java Spring基礎(chǔ)與IOC

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

    java正則表達式表單驗證類工具類(驗證郵箱、手機號碼、qq號碼等)

    這篇文章主要介紹了java使用正則表達式進行表單驗證工具類,可以驗證郵箱、手機號碼、qq號碼等方法,需要的朋友可以參考下
    2014-04-04
  • Java使用Swagger接口框架方法詳解

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

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

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

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

    Spring入門實戰(zhàn)之Profile詳解

    什么是spring profile?簡單講profile就是一組配置,不同profile提供不同組合的配置,程序運行時可以選擇使用哪些profile來適應(yīng)環(huán)境。下面這篇文章主要介紹了Spring中Profile實戰(zhàn)的相關(guān)資料,需要的朋友可以參考借鑒。
    2017-02-02
  • MyBatis-Plus 批量插入數(shù)據(jù)的操作方法

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

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

最新評論