5

Java の配列について 2 つの質問があります。お時間を割いていただけると幸いです。

質問1:

int[] intArray1 = { 1, 4, 2, 5, 6, 7, 2 };  
int[] intArray2 = { 1, 4, 2, 5, 6, 7, 2 };

intArray1.equals(intArray2);

しかし、それはfalseを返しますか?

質問2:

私はこのコードを実行します:

int[] intArray1 = { 1, 4, 2, 5, 6, 7, 2 };  //2 is duplicated
Arrays.binarySearch(intArray1,2);

-2 を返します。

しかし、重複を削除すると:

int[] intArray3 = { 1, 4, 2, 5, 6, 7}; // nothing is duplicated
Arrays.binarySearch(intArray1,2);

今は 2 を返します。これは正しいものです。

配列内のバイナリ検索が -2 につながる重複をどのように処理するのかわかりませんか?

4

6 に答える 6

7

質問 1 に関して: 配列は、2 つのオブジェクトが同一である場合にのみ返さequals()れる fromの既定の実装を継承します。以下を使用して、配列の内容が等しいかどうかをテストできます。Objecttrue

Arrays.equals(intArray1, intArray2);

質問 2 について: 配列がソートされていない限り、バイナリ検索は予測できない (そしてしばしば間違った) 結果を返します。特定のソートされていない配列でたまたま機能するのは偶然です。

于 2012-09-30T07:51:49.450 に答える
5

ソートされていない配列で binarySearch を呼び出すと、奇妙な結果が得られるのは普通のことです。javadocで明示されています。

二分探索アルゴリズムを使用して、指定された int の配列から指定された値を検索します。この呼び出しを行う前に、(上記の sort メソッドによって) 配列をソートする必要があります。ソートされていない場合、結果は未定義です。指定された値を持つ複数の要素が配列に含まれている場合、どれが見つかるかは保証されません。

必要に応じてequals返さfalseれます: 2 つの異なる配列を作成しequals、2 つの配列が異なることを示しますが、それらの内容は類似しています。Arrays.equals使用するつもりだった構造比較を実装します。

于 2012-09-30T07:50:28.093 に答える
4

Java の配列オブジェクトはメソッドをオーバーライドしませんequals()。したがって、ユーティリティ メソッドを使用する必要がありますArrays.equals()

Arrays.equals(intArray1, intArray2);

二分探索は、並べ替えられた配列でのみ機能します。

Arrays.sort(intArray1);
于 2012-09-30T07:52:10.073 に答える
2

質問1 :

この場合equals、コンテンツではなくオブジェクト (つまりポインター) を比較します。2 つの異なるオブジェクトを作成し、期待どおりにequals戻りfalseました。

于 2012-09-30T07:50:38.383 に答える
1

質問 #1:メソッドは、オブジェクトのequals()参照を比較しますが、参照内のコンテンツ自体は比較しません。したがって、あなたのケースでは equals() メソッドは失敗します。比較する 1 つの方法は、Arrays.equals(int[] a, int[] a2)を使用することです。Javadocによると:

指定された 2 つの Object 配列が互いに等しい場合に true を返します。両方の配列に同じ数の要素が含まれており、2 つの配列内の対応するすべての要素のペアが等しい場合、2 つの配列は等しいと見なされます。(e1==null ? e2==null : e1.equals(e2)) の場合、2 つのオブジェクト e1 と e2 は等しいと見なされます。つまり、同じ要素が同じ順序で含まれている場合、2 つの配列は等しいと言えます。また、2 つの配列参照は、両方が null の場合、等しいと見なされます。

質問 #2 : binarySearch(int[] a, int key)の Javadoc から:

二分探索アルゴリズムを使用して、指定された int の配列から指定された値を検索します。この呼び出しを行う前に、配列を (sort(int[]) メソッドで) ソートする必要があります。ソートされていない場合、結果は未定義です。指定された値を持つ複数の要素が配列に含まれている場合、どれが見つかるかは保証されません。

したがって、このメソッドが正しく機能するには、ソートされ、重複のない配列が必要になります。

于 2012-09-30T07:54:26.023 に答える
0

-まず、二分探索が に適用されsorted arrayます。これが異常な動作の理由です。

-次に、メソッドを使用する必要がありますArrays.equals():

Arrays.equals(intArray1, intArray2);

于 2012-09-30T08:37:40.027 に答える