配列内の数値を見つけるためのベストプラクティスは何ですか?

HellishHeat

..そして、ここで悪魔は何をしているのですか?

    int [] numbers1To9 = new int[]{1,2,3,4,5,6,7,8,9};
    System.out.println("one is here, true or false?: "+Arrays.asList(numbers1To9).contains(1));

出力:1つはここにあります、trueまたはfalse?:false

アラン

ソートされた配列を操作する場合、またはソートされていない配列へのソート操作が「安価」であるbinarySearchと見なすことができる場合、は適切なオプションと見なすことができます。Lists元の配列で直接機能するため、それ以上のコレクション(などの作成を回避し、必要なキーが格納されている位置(またはそれらの1つ)を識別します。その結果、その存在(暗黙的)とどこにあるインデックスを特定することができます。

すでに配列がソートされているので、あなたの場合は必要ありません(これはこのアルゴリズムを使用するための利点です)。ソートされていない配列を使用する場合、「未定義」の結果を回避するために、のArrays.sortに呼び出す必要があることに注意してくださいbinarySearch


たとえば、値(1)が存在するかどうかを知りたい場合

    //Arrays.sort(numbers1To9);
    boolean found = (Arrays.binarySearch((numbers1To9), 1))>=0?true:false; //--> true

たとえば、値(2の位置も取得したい場合

    //Arrays.sort(numbers1To9);
    int pos = Arrays.binarySearch((numbers1To9), 2); //-->1
    boolean found = pos>=0; //--> true

binarySearch要素が見つからない場合にのみ負の出力を返します。見つかったキーが重複している場合、指定されたキーのどの位置が返されるかは保証されません。

これに関係なく、結果が、の場合、>=0配列には数値が含まれることが保証され、必要な値も返されるインデックスに格納されることが保証されます。


キーが見つからない場合の結果はどういうわけか興味深いです

キーが見つからない場合に表示される否定的な結果は、次のロジックに従います。

(-(挿入点)-1)挿入ポイントは、キーが配列に挿入されるポイントとして定義されます。キーより大きい最初の要素のインデックス、または配列内のすべての要素が指定されたキーより小さい場合はa.lengthですこれにより、キーが見つかった場合にのみ、戻り値が0以上になることが保証されます。

したがって、9より大きい数値を見つけようとすると、挿入ポイントはになりますnumbers1To9.length -> 9したがって、10INTEGER.MAX_VALUEは同じ位置を出力します。

int pos = Arrays.binarySearch((numbers1To9), 10);                // -(9)-1 --> pos=-10
    pos = Arrays.binarySearch((numbers1To9), Integer.MAX_VALUE); // -(9)-1 --> pos=-10

数値が0の場合、挿入ポイントは次のようになります01が大きく、配列内での位置が0であるため)。

int pos = Arrays.binarySearch((numbers1To9), 0); // -(0)-1 --> pos=-1

ソートされていない配列で悪いbinarySearchがどのように機能するかを調べるために

    int [] numberUnsorted= new int[]{1,2,4,9,7,6,5,8,3};
    int pos = Arrays.binarySearch((numberUnsorted), 3); //--> pos = -3  (FAIL)
        pos = Arrays.binarySearch((numberUnsorted), 9); //--> pos = -10 (FAIL)
        pos = Arrays.binarySearch((numberUnsorted), 6); //--> pos = -4  (FAIL)

したがって、それらを「未定義」と呼ぶことは、本当に慈悲深いサームです。


binarySearchは
、配列の条件がソートされている状態で、配列内の数値を検索するための「ベストプラクティスの1つ」であることに注意してください配列がソートされていない他のシナリオでは、配列のソートの複雑さに気づき、ソート操作を必要としない別のメカニズムがより良いアプローチであるかどうかを判断する場合があります。配列のタイプ、サイズ、および値によって異なります。通常、検索の特定のコンテキストを知らなければ、「最良の決定的な方法」はありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Yiiで変数値を伝播するためのベストプラクティスは何ですか

分類Dev

React Nativeのレルムクエリ:クエリを見つけるためのベストプラクティスは何ですか?

分類Dev

Vuexの状態(突然変異をコミットしない関数)について何かを見つけるためのベストプラクティス

分類Dev

PHPのクラス内の関数から値を取得するためのベストプラクティスはどれですか?

分類Dev

JavaScriptでオブジェクトの配列の特定の値に対してカスタム関数を実行するためのベストプラクティスは何ですか?

分類Dev

レデューサーの配列から重複アイテムを削除するためのベストプラクティスは何ですか?

分類Dev

複数の結果を持つJava 8ストリームを管理するためのベストプラクティスは何ですか

分類Dev

ULタグ内で複数のタイトルを使用するためのベストプラクティスは何ですか

分類Dev

Python-クラス変数を返すためのベストプラクティスは何ですか?

分類Dev

これらの2つのクラスを共通のクラスに抽出するためのベストプラクティスは何ですか?

分類Dev

後で特定のオブジェクトを見つけるためにふるいにかけるために、メモリに特定のオブジェクトを多数格納するためのベストプラクティスはありますか?

分類Dev

Appiumが要素を見つけるためのベストプラクティス

分類Dev

同じベースの複数のプロジェクトでgitを使用するためのベストプラクティスは何ですか?

分類Dev

配列リストに格納されているオブジェクトの平均値を見つけるための最良の方法は何ですか?

分類Dev

テンプレートから関数内の$ scope-variableを渡すためのベストプラクティスは何ですか?

分類Dev

統合テストを実行するためのベスト プラクティスは何ですか?

分類Dev

大きな静的配列をAngularに格納するためのベストプラクティスは何ですか?

分類Dev

Rパッケージの関数を並列化するためのベストプラクティスは何ですか?

分類Dev

Fortran関数が配列を返すときのベストプラクティスは何ですか?

分類Dev

実際に挿入せずに(c#で)ソートされた数値リストまたは配列内の挿入位置を見つけるための最速のデータ構造および/またはアルゴリズムは何ですか?

分類Dev

JDBCでSQLクエリを作成するためのベストプラクティスは何ですか

分類Dev

ページにCSSとJavaScriptを含めるためのベストプラクティスは何ですか?

分類Dev

暗号化された列のプロパティを変更するためのベストプラクティスは何ですか

分類Dev

スプリングブートアプリケーションの値を格納するためのベストプラクティスは何ですか?

分類Dev

Rxハンドラーを実装するためのベストプラクティスは何ですか?

分類Dev

リスト内の特定の数値に最も近い小さい値と大きい値を見つけるための最良の方法は何ですか

分類Dev

同じリンクを複数回使用するためのベストプラクティスは何ですか?

分類Dev

アイテムを見つけるための良いアプローチはどれですか?オブジェクトまたはオブジェクトの配列内の複数のプロパティ?

分類Dev

Javaで配列に要素を提供する場合のベストプラクティスと見なされるものは何ですか?

Related 関連記事

  1. 1

    Yiiで変数値を伝播するためのベストプラクティスは何ですか

  2. 2

    React Nativeのレルムクエリ:クエリを見つけるためのベストプラクティスは何ですか?

  3. 3

    Vuexの状態(突然変異をコミットしない関数)について何かを見つけるためのベストプラクティス

  4. 4

    PHPのクラス内の関数から値を取得するためのベストプラクティスはどれですか?

  5. 5

    JavaScriptでオブジェクトの配列の特定の値に対してカスタム関数を実行するためのベストプラクティスは何ですか?

  6. 6

    レデューサーの配列から重複アイテムを削除するためのベストプラクティスは何ですか?

  7. 7

    複数の結果を持つJava 8ストリームを管理するためのベストプラクティスは何ですか

  8. 8

    ULタグ内で複数のタイトルを使用するためのベストプラクティスは何ですか

  9. 9

    Python-クラス変数を返すためのベストプラクティスは何ですか?

  10. 10

    これらの2つのクラスを共通のクラスに抽出するためのベストプラクティスは何ですか?

  11. 11

    後で特定のオブジェクトを見つけるためにふるいにかけるために、メモリに特定のオブジェクトを多数格納するためのベストプラクティスはありますか?

  12. 12

    Appiumが要素を見つけるためのベストプラクティス

  13. 13

    同じベースの複数のプロジェクトでgitを使用するためのベストプラクティスは何ですか?

  14. 14

    配列リストに格納されているオブジェクトの平均値を見つけるための最良の方法は何ですか?

  15. 15

    テンプレートから関数内の$ scope-variableを渡すためのベストプラクティスは何ですか?

  16. 16

    統合テストを実行するためのベスト プラクティスは何ですか?

  17. 17

    大きな静的配列をAngularに格納するためのベストプラクティスは何ですか?

  18. 18

    Rパッケージの関数を並列化するためのベストプラクティスは何ですか?

  19. 19

    Fortran関数が配列を返すときのベストプラクティスは何ですか?

  20. 20

    実際に挿入せずに(c#で)ソートされた数値リストまたは配列内の挿入位置を見つけるための最速のデータ構造および/またはアルゴリズムは何ですか?

  21. 21

    JDBCでSQLクエリを作成するためのベストプラクティスは何ですか

  22. 22

    ページにCSSとJavaScriptを含めるためのベストプラクティスは何ですか?

  23. 23

    暗号化された列のプロパティを変更するためのベストプラクティスは何ですか

  24. 24

    スプリングブートアプリケーションの値を格納するためのベストプラクティスは何ですか?

  25. 25

    Rxハンドラーを実装するためのベストプラクティスは何ですか?

  26. 26

    リスト内の特定の数値に最も近い小さい値と大きい値を見つけるための最良の方法は何ですか

  27. 27

    同じリンクを複数回使用するためのベストプラクティスは何ですか?

  28. 28

    アイテムを見つけるための良いアプローチはどれですか?オブジェクトまたはオブジェクトの配列内の複数のプロパティ?

  29. 29

    Javaで配列に要素を提供する場合のベストプラクティスと見なされるものは何ですか?

ホットタグ

アーカイブ