こんにちは、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という数字がどのような理由で出てきたのか教えてください。
宜しくお願い致します。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
binarySearchでは、キーがみつからない場合は、そのリストでキーが挿入される位置をマイナスにした値が返される、というのが本来の動きだったと思います。
a:boy:he:is:で-3が返されるとなると、インデックス3 = isの後ろを意味することになりますね。ちょっと変だな・・・。あるいは、ソートによってList内がどのようになっているかちょっとわからないのですが、もし本来のインデックスが内部的に保たれているとすると、he:is:a:boy:のインデックス3 = boyの後、ということで-3になっているのかも。このへんはどうもよくわかりませんが。
このへんは、最初からソートされたデータを用意して探索してみるとはっきりするかも知れませんね。
No.2
- 回答日時:
APIリファレンスの「戻り値」に解説があります。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …
検索キーがリストにない場合は (-(挿入ポイント) - 1)。挿入ポイントとは、リストでキーが挿入されるポイントである。
参考URL:http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …
No.3
- 回答日時:
CollectionsのソースコードはJDKに付属しています。
binarySearchの実処理は20行にも満たない初歩的なコードなので読んでみると良いと思います。
この場合に何故-3が返ってくるのかすぐ解ると思います。
No.4
- 回答日時:
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 を返すのでは、、、
という感想です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- 英語 この英文の意味を教えてください 3 2023/07/07 20:36
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- 英語 英文の添削お願いします。【長文です。】 マッチングアプリで相手を言い負かしている時のやつです。 色々 1 2023/07/01 02:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
EclipseでJava
-
JAVAのDouble型の小数点以下の...
-
Javaのコマンドライン引数を使...
-
[JAVA]try 内の変数を外で!?
-
printfの%fにおいて教本どおり...
-
java シンボルが見つかりません...
-
会員情報登録プログラムの作成...
-
(急募) Javaじゃんけんゲームで...
-
binarySearchについて
-
配列を後ろから数えるには?
-
エクスクラメーション2つ?
-
エクセルマクロ文で、赤文字セ...
-
メール送信を行うJavaプログラム
-
コマンドプロンプトに不正な文...
-
Javaでファイル転送プログラム
-
javaで判別式のプログラミング...
-
LC発振回路-ループ利得
-
JAVAのエラーの意味が分かりま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインターに関する警告
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
JAVAのDouble型の小数点以下の...
-
EclipseでJava
-
「続行するには何かキーを押し...
-
文字列の引き算
-
java シンボルが見つかりません...
-
JAVA 文字色変更
-
改行の判定方法
-
JAVAのエラーの意味が分かりま...
-
Javaのコマンドライン引数を使...
-
java教えてください。
-
曜日の取得方法を教えて下さい!
-
JavaにはなぜGO TO ...
-
Javaでカレントディレクトリを...
-
構文解析中にファイルの終わり...
-
JAVA 三角形の判定
-
複数行キーボード入力した後に...
-
printfの%fにおいて教本どおり...
おすすめ情報