這是我在執行二進制搜索嘗試必須跟隨器的二進制搜索:使用`Collections.binarySearch`簽名
static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
不過,我想,以避免重複代碼,並委託實施的一個另一個(目前是第一個到第二個)。要做到這一點,我需要擺脫通配符?
,並使用第二泛型類型,像這樣:
public class BinarySearch {
public static <Q extends Comparable<? super T>, T>
int search(List<Q> xs, T x) {
return search(xs, x, Q::compareTo);
}
public static <T>
int search(List<? extends T> xs, T x, Comparator<? super T> cmp) {
int l = 0, r = xs.size() - 1;
while (l <= r) {
int mid = l + (r - l)/2;
if (cmp.compare(xs.get(mid), x) == 0)
return mid;
if (cmp.compare(xs.get(mid), x) < 0)
r = mid - 1;
else
l = mid + 1;
}
return xs.size();
}
}
不幸的是,這並不能編譯,與錯誤而失敗:
Non-static method cannot be referenced from a static context
如何我能解決這個問題嗎?
PS:如果你想知道爲什麼從Collections
簽名看看他們的方式,這裏是一個解釋:How do these two generic signatures for Collections.binarySearch differ?
PPS:曾經有(一現已刪除)回答,你不能傳遞T::compareTo
預計需要Comparator
。好吧,我相信你能,這裏要說的是正是這麼做的快速排序的我工作的落實:https://github.com/all3fox/algos-java/blob/481f2c71952bf2c7510cb93cc1af8e90016ccf3b/src/main/java/io/github/all3fox/sort/QuickSort.java
您的二分查找有更多問題。如果找不到元素,它會丟失'return'語句。 – Codo
@Codo thx,已修復。那麼泛型怎麼樣? – alisianoi