- 締切済み
binarySearchについて
こんにちは、Javaを勉強しているものです。 binarySearchをしたとき、存在しない値を検索すると負の値が戻されると聞きましたが、その数値はどのようにして決められるのでしょうか? import java.util.*; class Sample { public static void main(String[] args){ String[] a ={"he", "is", "a", "boy"}; List<String> li = Arrays.asList(a); for(String s : a) System.out.print(S + ":"); System.out.println(); Collections.sort(li); for(String s: li) System.out.print(s + ":"); System.out.println(); System.out.println(Collections.binarySearch(li, "boy")); System.out.println(Collections.binarySearch(li, "girl")); Collections.reverse(li); for(String s: li) System.out.print(S + ":"); } } このコードの実行結果は、 he:is:a:boy: a:boy:he:is: 1 -3 is:he:boy:a: となります。 "girl"は、リストに存在しないので負の値である"-3"が返されたわけですが、3という数字がどのような理由で出てきたのか教えてください。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- J_H
- ベストアンサー率57% (11/19)
ANo.2 の方の説明にあるとおりですが。。。 挿入ポイントとは、見つからなかったキーを、検索したリストに入れるとしたら何処?の「何処」です(ソースを見ると、挿入ポイントは狭められた集合の左端の値です)。 List {"a", "boy", "he", "is"} にgirl を入れるとしたら、boy と he の間、インデックスが2の位置です。binarySearch の戻り値は -3ですね。 では何で、binarySearchは素直に挿入ポイントの値を返さないかというと、挿入ポイントが0になる場合があるからです。 例) List { "max", "mix"} key="mac" 挿入ポイントが0で、0を返すと、0番目にキーが見つかったと判断されてしまうので、キーが見つからないのに見つかったという矛盾が生じます。 また、ArrayList は場所をきめ打ちして値を格納できるので、挿入ポイントを使って値を格納すれば、後にソートする必要もないですね。 なので、-(挿入ポイント) - 1 を返すのでは、、、 という感想です。
- Bonjin
- ベストアンサー率43% (418/971)
CollectionsのソースコードはJDKに付属しています。 binarySearchの実処理は20行にも満たない初歩的なコードなので読んでみると良いと思います。 この場合に何故-3が返ってくるのかすぐ解ると思います。
- JavaZou
- ベストアンサー率50% (1/2)
APIリファレンスの「戻り値」に解説があります。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Collections.html#binarySearch(java.util.List,%20T) 検索キーがリストにない場合は (-(挿入ポイント) - 1)。挿入ポイントとは、リストでキーが挿入されるポイントである。
binarySearchでは、キーがみつからない場合は、そのリストでキーが挿入される位置をマイナスにした値が返される、というのが本来の動きだったと思います。 a:boy:he:is:で-3が返されるとなると、インデックス3 = isの後ろを意味することになりますね。ちょっと変だな・・・。あるいは、ソートによってList内がどのようになっているかちょっとわからないのですが、もし本来のインデックスが内部的に保たれているとすると、he:is:a:boy:のインデックス3 = boyの後、ということで-3になっているのかも。このへんはどうもよくわかりませんが。 このへんは、最初からソートされたデータを用意して探索してみるとはっきりするかも知れませんね。