2016-10-22 12 views
1

はJavaでCollections.binarySearchの定義です:私はそれを理解したようCollections.binarySearchの2つの一般的な署名はどのように異なるのですか?ここ

static <T extends Comparable<? super T>> int binarySearch(List<T> list, T key) 
static <T> int binarySearch(List<T>, T x, Comparator<? super T>) 

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) 

はどのように彼らは(Collections.sortに似ています)以下の定義は異なります

最初の定義では、値のリストの中でタイプTのキーを検索することができます。値のタイプは、タイプTのインスタンスを比較する方法を知っている、 "タイプ"です。

Comparatorを使用して、タイプTのタイプのいずれかを比較する方法を知っているタイプのタイプのキーのうち、タイプがTタイプと同じか "低い"タイプのキーを検索できます「上」タイプ。

基本的に、私は理解していないことは、リストの内容がキーと同じタイプを持つように強制されないのはなぜですか?

+1

別の方法: ' int型binarySearch(一覧、Comparableを)' – ZhongYu

答えて

2

最初のシグネチャセットは少し一般的です。これは奇数のエッジケースで動作し、2番目のエッジケースは拒否します。これは、最初の署名のために動作しますが、(あなたが最初Timestampkeyを変換する必要があると思います)は、第2の下型エラーとして拒否される

import java.sql.Timestamp; // extends Date implements Comparable<Date> (!) 
import java.util.Date; 

List<Timestamp> timestamps = ...; 
Date key = ...; 
int index = Collections.binarySearch(timestamps, key); 

の場合を考えてみましょう。

これはまれなことかもしれませんが、TimestampDateの例では、JDKの例があります。

binarySearchは、リストの要素とリストの他の要素を比較する必要はないことを覚えておいてください。リストの要素と指定されたkeyを比較することしかないので、リストの要素がkeyと匹敵する(必ずしもそうでなくてもよい)ことを要求することは意味をなさない。

+1

の要素が互いに:) – ZhongYu

+0

@ZhongYuに比較しない場合は、実際にリストを並べ替えることはできません - あなたはソートを思い付いた方法リストは 'binarySearch'には関係ありません。リストをソートする場合は、リスト項目を比較できる必要があります。しかし、 'binarySearch'はその要素をソートするのではなく、リストを検索したいだけです。それは言った:もちろん、バイナリ検索は、リストがソートされている順序は、検索時に使用されているものと互換性がない場合、動作しません... – Dirk

+0

ちょうど実質的に話す。しかし、たとえ思考ゲームで少しでも満足していても、リストの要素を互いに比較する必要があります。これは、要素タイプ「V」は、「Comparable 」のサブタイプでなければならず、「V」は「X」のサブタイプでなければならないため、「V.compareTo(V)」が可能です。 http://stackoverflow.com/a/34780320/2158288を参照してください。これは型システムからは明らかではありませんが、 'Comparable'の規約が適切に実装されていれば真でなければなりません。したがって、要素を互いに比較するためにランタイムキャストを合理的に行うことができます。 – ZhongYu

関連する問題