..そして、ここで悪魔は何をしているのですか?
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
。したがって、10
とINTEGER.MAX_VALUE
は同じ位置を出力します。
int pos = Arrays.binarySearch((numbers1To9), 10); // -(9)-1 --> pos=-10
pos = Arrays.binarySearch((numbers1To9), Integer.MAX_VALUE); // -(9)-1 --> pos=-10
数値が0の場合、挿入ポイントは次のようになります0
(1が大きく、配列内での位置が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]
コメントを追加