簡體   English   中英

為什么在Java 1.8中進行此類排序

[英]Why does this sort in Java 1.8

取自Joshua Bloch和Neal Gafter的Java Puzzlers

import java.util.*;

public class BananaBread {
    public static void main(String[] args) {
        Integer[] array = { 3, 1, 4, 1, 5, 9 };
        Arrays.sort(array, new Comparator<Integer>() {
            public int compare(Integer i1, Integer i2) {
                return i1 < i2 ? -1 : (i2 > i1 ? 1 : 0);
            }
        });
        System.out.println(Arrays.toString(array));
    }
}

預期的行為是未定義的,文本說它返回[3,1,4,1,5,9]。 這適用於Java V1.7。 但是,在Java v.1.8中,輸出是排序列表。

我可以看到Timsort是Java 1.8中的新功能,但我不確定算法如何使用不一致的比較器(例如上面給出的)來運行。 任何有關如何做到這一點的幫助或見解將不勝感激。

Java 8使用修改的合並排序。 它使用的關鍵是

// From TimSort.binarySort
while (left < right) {
    int mid = (left + right) >>> 1;
    if (c.compare(pivot, a[mid]) < 0)  // compares for less than 0.
        right = mid;
    else
        left = mid + 1;
}

注意:它只關心你是返回-1還是0(更具體地說是<0,true或false)

你的比較器與

return i1 < i2 ? -1 : 0;

所以在這個代碼的所有重要方面都是正確的。

注意:如果您更改此代碼

return i1 > i2 ? +1 : 0;

它沒有任何排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM