【发布时间】:2016-10-23 04:57:21
【问题描述】:
这是我尝试实现必须遵循的二分搜索:
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:曾经有一个答案(现在已删除),您不能在预期 Comparator 的地方传递 T::compareTo。好吧,我相信你可以,这是我的 QuickSort 工作实现,它正是这样做的:https://github.com/all3fox/algos-java/blob/481f2c71952bf2c7510cb93cc1af8e90016ccf3b/src/main/java/io/github/all3fox/sort/QuickSort.java
【问题讨论】:
-
您的二分搜索有更多问题。它缺少
return语句,以防找不到元素。 -
@Codo thx,已修复。那么泛型呢?
标签: java algorithm generics binary-search