java Comparator介面中(底層原始碼)compare方法決定排序的升序降序問題
阿新 • • 發佈:2019-02-10
轉自CSDN論壇,稍加整理和總結 點選開啟連結
Comparator升序降序實現
int compare(Object o1, Object o2) 返回一個基本型別的整型
1) 如果要按照升序排序,
則o1 小於o2,返回-1(負數),相等返回0,01大於02返回1(正數)
那這是為什麼呢?通過底層原始碼瞭解一下:
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中的if,那麼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中,那麼繼續往下看,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++]; } }
for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
swap(dest, j, j-1);
這個看到了麼,如果呼叫compare方法大於0,就把前一個數和後一個數交換,也就是把大的數放後面了,即所謂的升序了。那麼再想想看return arg0-arg1是不是返回的與這裡正好匹配呢。差不多說這麼多,相信你應該明白了。