を使用してバイナリ検索を実装することは従わなければならないバイナリ検索を実装する時、私の試みです:はここで `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)
しかし、私は、コードの重複を避けたいと実装の1つに委任うもう1つ(現在、最初から2番目)。
Non-static method cannot be referenced from a static context
方法:エラーで失敗し、
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();
}
}
残念ながら、これはコンパイルされません:私は、ワイルドカード?
を取り除くために必要があるので、同様に第二ジェネリック型を使用することを行うために、私はそれを修正できますか?
PS:Collections
からの署名は彼らのやり方を見て、なぜあなたは不思議に思うならば、ここでの説明は次のとおりです。How do these two generic signatures for Collections.binarySearch differ?
PPS:あなたはT::compareTo
を渡すことはできません(今削除された)の答えがあるように使用Comparator
が期待されるところにある。 Qを使用する理由https://github.com/all3fox/algos-java/blob/481f2c71952bf2c7510cb93cc1af8e90016ccf3b/src/main/java/io/github/all3fox/sort/QuickSort.java
バイナリ検索に問題があります。要素が見つからない場合は 'return'文がありません。 – Codo
@Codo thx、fixed。しかしジェネリックはいかがですか? – alisianoi