Use of ascending descending Comparator

A recent problem with the compare algorithm method under the Comparator interface, thought about how the rules are to ascending and descending, and now do a supplement to facilitate later review.

 

 Ascending Code

    public static void main(String[] args) {
        Integer[] nums = new Integer[]{6, 8, 3, 0, 2};
        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 + "  ");
        }
    }

 

Descending Code

    public static void main(String[] args) {
        Integer[] nums = new Integer[]{6, 8, 3, 0, 2};
        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 + "  ");
        }
    }

 

 

More so when we remember is directly compare (int o1, int o2) method return o1 - o2 is ascending, return o2 - o1 is descending. So we might as well jump into the reasons to look at the source code

 

    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);
        }
    }

It can be seen that he is a go inside else, may wish to look into the 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);
    }

Here it is clear also go inside else, continue to look 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++];
        }
    }

This section of the code that follows is a key part

        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;
        }

It can be seen that the compare method is called inside, when the return value is greater than 0, the method will be an array of a number of front and rear of a number in exchange. In ascending order as an example to explain, in ascending order, then compare the method to return o1 - o2, then that return dest [j-1] - dest [j].

When dest [j-1]> When dest [j], to be exchanged. When dest [j-1] <= dest [j] the same position, so as to achieve an array in ascending order. Descending is the same reason, do not speak.

 

Guess you like

Origin www.cnblogs.com/lzxin/p/11326481.html