'Collections.sort()'如何使用'compare()'方法的结果?



Comparator接口中的compare()方法的输出是-1、0或1。然后将其传递给Collections.sort()方法,该方法可用于以自定义方式对列表进行排序。

sort()与compare()方法的结果有什么关系?(-1,0或1)

我想我最困惑的是compare()有三个输出负、正或0),但为什么算法不需要其中的两个呢?不能a=b时的动作与a>b或a<b?难道我们不需要两个输出吗?(ei。正的和负的)

。比较两个数字a和b,如果a<b或a=b,则取a(例如;Compare()返回-1),如果a>b则取b (Compare()返回+1)。为什么算法需要区分a<b和a=b?

class ReverseAlphabeticalComparator implements Comparator<Integer> {
@Override
public int compare(Integer i1, Integer i2) {
    if(i1 > i2) {
        return 1;
    }
    else if(i1 < i2) {
        return -1;
    }
    return 0;
}  
class App {
public static void main(String[] args) {
    List<Integer> animals = new ArrayList<Integer>();
    animals.add(6);
    animals.add(2);
    animals.add(4);
    animals.add(7);
    animals.add(8);
    animals.add(3);
    Collections.sort(numbers, new ReverseNumericalComparator());
        for(String numbers: numbers) {
            System.out.println(numbers); //Prints numbers in reverse eg. 8,7,6,4,3,2
        }
    }
}

sort()与compare()方法的结果有什么关系?

sort比较一系列元素对,并根据compare的结果判断该对元素是否需要交换。

compare的结果不一定是-101。从文档

返回negative整数、zero整数或positive整数,第一个参数为
小于等于,或大于

大多数(所有?)排序算法只需要知道对于我们排序的集合中的每个元素,a是否小于/大于/等于b。因此,您只需要从compare()返回负、0或正(在许多情况下-1、0和1)的值。

如果你读过不同的排序算法,你会注意到它们都是建立在这个基础上的,从简单的冒泡排序到快速排序,合并排序等等。

它的作用是:sort调用数组。sort(调用Arrays.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++];
    }
}

最新更新