国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Collections.sort()方法解析

2019-11-06 06:02:04
字體:
來源:轉載
供稿:網友

首先注意這里調用sort方法的是Collections類,他是集合框架中的一員,其中實現了大量的工具方法,有時間可以自行查看: 這里寫圖片描述

下面是一個簡單的測試類:

import java.util.*;/** * Created by Admin on 2017/3/7. */public class CollectionTest { public static void main(String[] args){ List<Integer> list_1 = new ArrayList<Integer>(Arrays.asList(2,1,4,8,5)); System.out.其中創建了一個ArrayList實例去測試sort()方法,執行結果如下: 這里寫圖片描述


開始進入正題,我們首先查看Collections中sort方法的源代碼:

public static <T extends Comparable<? super T>> void sort(List<T> list) { list.sort(null);//傳入參數還可以是一個Comparator對象,但是也有一定的要求 }

其中牽扯了許多泛型,T表示要排序的序列中的包含類型,這里出現了一個要求,類型 T 必須實現 Comparable 接口,public final class Integer extends Number implements Comparable<Integer>,并且這個接口的類型是 T 或 T 的任一父類。這樣聲明后,T 的實例之間,T 的實例和它的父類的實例之間,可以相互比較大小。傳入的參數為List類型。

這樣,我們又開始查看List中的sort方法,只是為了讓排序能繼續進行,對數據類型進行 一些處理:

default void sort(Comparator<? super E> c) { Object[] a = this.toArray();//向上地獲取數組對象 Arrays.sort(a, (Comparator) c);//傳入下一層 ListIterator<E> i = this.listIterator(); for (Object e : a) { i.next(); i.set((E) e);//將數組對象類型還原 } }

再次進入Arrays類的sort,此處傳入的參數是Object的:

public static void sort(Object[] a) { //如果符合要求,直接對序列進行歸并排序操作(legacyMergeSort),最后的歸并排序代碼可以自己看一下,我就不貼了 //private static void mergeSort(Object[] src,Object[] dest,int low,int high,int off) if (LegacyMergeSort.userRequested) legacyMergeSort(a); else //否則,進入下一環節 ComparableTimSort.sort(a, 0, a.length, null, 0, 0); }

在1.7之后,不再默認使用歸并排序,LegacyMergeSort.userRequested被默認為false,也可以通過來更換

System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");

所以再再進入ComparableTimSort的sort(),別急,馬上就完! 傳入參數數組a,lo與hi為要執行排序序列的開始與結束位置,work是一個備用的空間,可以為其設置屬性,在上面方法的調用中,我們并沒有使用到work

static void sort(Object[] a, int lo, int hi, Object[] work, int workBase, int workLen) { assert a != null && lo >= 0 && lo <= hi && hi <= a.length; int nRemaining = hi - lo; if (nRemaining < 2)//少于2個數字拿來排序,到這里才返回...有毒 return; // 0或1個數字總是排好序的(有點像放屁 if (nRemaining < MIN_MERGE) {//MIN_MERGE的值為32 int initRunLen = countRunAndMakeAscending(a, lo, hi); //大小小于32時,使用二叉排序! binarySort(a, lo, hi, lo + initRunLen); return; } ComparableTimSort ts = new ComparableTimSort(a, work, workBase, workLen); int minRun = minRunLength(nRemaining);//minRun值等于長度的一直除以2,直到小于MIN_MERGE do { // Identify next run int runLen = countRunAndMakeAscending(a, lo, hi); // If run is short, extend to min(minRun, nRemaining) if (runLen < minRun) { int force = nRemaining <= minRun ? nRemaining : minRun; binarySort(a, lo, lo + force, lo + runLen); runLen = force; } // Push run onto pending-run stack, and maybe merge ts.pushRun(lo, runLen); ts.mergeCollapse(); // Advance to find next run lo += runLen; nRemaining -= runLen; } while (nRemaining != 0); // Merge all remaining runs to complete sort assert lo == hi; ts.mergeForceCollapse(); assert ts.stackSize == 1; }

其中使用的二分查找與合并等種種過程,根據一個個條件優化操作。精華的地方慢慢品吧。稍后添加!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 六盘水市| 石河子市| 黄浦区| 旬阳县| 阿克苏市| 安岳县| 宜宾县| 新余市| 沙坪坝区| 鹤岗市| 孙吴县| 二连浩特市| 湟源县| 那坡县| 怀远县| 灯塔市| 梁河县| 呼伦贝尔市| 栾城县| 当阳市| 孟津县| 民乐县| 全南县| 沐川县| 定西市| 海林市| 云浮市| 宜宾市| 赤壁市| 界首市| 根河市| 榆树市| 繁峙县| 和静县| 内乡县| 四子王旗| 仁寿县| 文水县| 北流市| 桐乡市| 西贡区|