2

さて、ここに私の簡単なコードがあります。ここでは、文字列配列を作成し、この配列内の文字列を検索しようとしています:

String[] arr = new String[5];
arr[0] = "ccc";
arr[1] = "aaa";
arr[2] = "bbb";
arr[3] = "eee";
arr[4] = "ddd";

System.out.println(Arrays.binarySearch(arr,"eee"));

Java 6 binarySearch ドキュメントから直接引用: 「配列は、この呼び出しを行う前にソートする必要があります。ソートされていない場合、結果は未定義です」!

実際、私はコードを何度か実行して、NOT SORTED Array 内の eee の位置である常に 3 を出力として取得しますが、ドキュメントに記載されているように、結果は「未定義」ではないようです。

私は何が欠けていますか?

ありがとう

4

6 に答える 6

8

「未定義」は、「間違いなく間違った結果をもたらす」または「間違いなくクラッシュする」という意味ではありません。

于 2012-05-07T20:28:21.423 に答える
5

コードの一部がどのように動作するかについて話しているとき、「未定義」という用語は、プログラムの実行が次のいずれかを行う可能性があることを意味します。

  • 間違った答えを返す
  • 永久ループ
  • すぐにクラッシュ
  • 一部のデータが破損し、後でクラッシュが発生する
  • 意図しない他のことをする (例: ハードドライブの消去)
  • ラッキーになって正しい答えを返す

プログラマーへのアドバイスとして、undefined behavior を呼び出さないでください。良いことも悪いことも、現在または後で何かが起こる可能性があるためです。

于 2012-05-07T20:30:56.267 に答える
4

この場合のように、「結果は未定義です」には「正しい」答えの可能性が含まれていることを見逃しています。

arr[1] を "eee" に変更すると、別の結果が表示されます。

于 2012-05-07T20:28:12.083 に答える
4

多くの研究所、本、教授などで定義されている二分探索。要素をアルファベット順または数値順にソートする必要がありました。

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    String[] arr = new String[6];
    arr[0] = "ccc";
    arr[1] = "aaa";
    arr[2] = "bbb";
    arr[3] = "eee";
    arr[4] = "ddd";
    arr[5] = "aaa";
    System.out.println(Arrays.toString(arr));
    System.out.println("\"eee\" was found at index: " + Arrays.binarySearch(arr, "eee"));
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
    System.out.println("\"eee\" was found at index: " + Arrays.binarySearch(arr, "eee"));
  }
}
于 2012-05-07T20:28:33.643 に答える
3

「未定義」は、アルゴリズムが配列で実行されることを意味しますが、結果が正しいとは限りません(バイナリ検索が機能するには、ソートされた配列が強く必要です)。これが起こるので、あなたの例はうまくいきます:

  • 最初=0、最後= 4、中間=2で二分探索を入力します
  • array [middle] with "eee"( "bbb" <"eee")=> first = 2 + 1; 真ん中=3;
  • array[middle]を"eee"=>"found"と比較します; 3を返します。
于 2012-05-07T20:32:08.883 に答える
1

esej の答えに加えて、間違った答えを返すプログラムの変更を次に示します。

public class Main {
    public static void main(String[] args) {
        String[] arr = new String[6];
        arr[0] = "ccc";
        arr[1] = "aaa";
        arr[2] = "bbb";
        arr[3] = "eee";
        arr[4] = "ddd";
        arr[5] = "aaa";

        System.out.println(Arrays.binarySearch(arr, "eee"));
    }
}
于 2012-05-07T20:28:51.337 に答える