Collections.sort(list, Comparator()); 言ってみろ


今日は関連コードを見てCollectionsを見ました.sort()は、Collectionsが1つのツールクラスに多くのソート検索などの静的メソッドが含まれていることを知っていて、良いutilツールクラスです.しかし、コードはよく見ていないので、今日は少し体得しました.
 
 
まず、元の方法を開始します.
 
public static <T> void sort(List<T> list, Comparator<? super T> c) {
	Object[] a = list.toArray();
	Arrays.sort(a, (Comparator)c);
	ListIterator i = list.listIterator();
	for (int j=0; j<a.length; j++) {
	    i.next();
	    i.set(a[j]);
	}
    }
 
リストをArrayに変更してから並べ替え、最後に変換することに気づきました.
 
 
まずトアリー()の方法についてお話ししましょう
以下、それぞれArrayListとLinkedListの実装について説明する
 public Object[] toArray() {
        return Arrays.copyOf(elementData, size); //elementData            size   list   
 }//     ArrayList    Array  
 
 
public Object[] toArray() {
	Object[] result = new Object[size];
        int i = 0;
        for (Entry<E> e = header.next; e != header; e = e.next)
            result[i++] = e.element;
	return result;
    }//                       

 
TOArray()を見てからsort()を見てみましょう
 
Array.sort()はこうです
 
public static <T> void sort(T[] a, Comparator<? super T> c) {
	T[] aux = (T[])a.clone();
        if (c==null)
            mergeSort(aux, a, 0, a.length, 0);
        else
            mergeSort(aux, a, 0, a.length, 0, c);
    }

mergeSort法という方法のいくつかのパラメータの意味はsrc,dest,low,high,offset,compartor見名の意味である.
 
 
この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   
        //    INSERTIONSORT_THRESHOLD 7  





                



         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; //        '/2' 
        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++];
        }
    }
 
上の1つの方法は差が少ない3つの状況を考慮したでしょう本当のソースコードはやはり厳格です