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)。为什么算法需要区分< 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
}
}
}
答案 0 :(得分:1)
sort()对compare()方法的结果有什么作用?
sort
比较一系列元素对,并根据compare
的结果,看看是否应该交换该对中的元素。
compare
的结果也不一定是-1
0
和1
。来自documentation
返回
negative
整数,zero
或positive
整数,因为第一个参数是
小于,等于,或大于第二个。
答案 1 :(得分:0)
对于我们正在排序的集合中的每个元素,大多数(所有?)排序算法只需要知道a
是小于/大于/等于b
。因此,您只需要从compare()
返回负值,0或正值(在很多情况下为-1,0和1)。
如果您阅读了不同的排序算法,您会发现它们是基于此构建的,从简单的冒泡排序到快速排序,合并排序等。
答案 2 :(得分:0)
这是它的作用(Collections.sort调用Arrays.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++];
}
}