web-dev-qa-db-ja.com

Javaで2つのオブジェクト配列を比較する方法は?

次のような2つのオブジェクト配列があります。

Object[] array1 = {0, 1, 2, 3};
Object[] array2 = {0, 1, 2, 3};

配列が等しいかどうか知りたいのですが。 array1のすべての値は、array2のその位置の値と同じであるため、等しいと定義しています。したがって、これらの2つの配列は等しくなります。

これらの2つの配列が等しいかどうかを確認する最良の理由は何ですか?

if(array1 == array2) 

は深い等式ではないため、機能しません。各要素をループして比較することが、この問題を解決するための最良かつ最も効率的な方法であるかどうかはわかりません。誰かより良い提案がありますか?

編集:入れ子になった配列に入ることができる等号が必要でした。

12
Grammin

Arrays.deepEquals() を使用します。これはArrays.equals()と同じ働きをしますが、ネストされた配列でも機能します。

指定された2つの配列が互いに完全に等しい場合、trueを返します。 equals(Object[],Object[])メソッドとは異なり、このメソッドは任意の深さのネストされた配列での使用に適しています。

2つの配列参照は、両方がnullの場合、または同じ数の要素を含む配列を参照していて、2つの配列内の対応するすべての要素のペアが完全に等しい場合に完全に等しいと見なされます。

次の条件のいずれかが当てはまる場合、2つのヌル要素e1とe2は完全に等しくなります。

  • e1とe2はどちらもオブジェクト参照タイプの配列であり、Arrays.deepEquals(e1、e2)はtrueを返します。
  • e1とe2は同じプリミティブ型の配列であり、Arrays.equals(e1、e2)の適切なオーバーロードはtrueを返します。
  • e1 == e2
  • e1.equals(e2)はtrueを返します。

この定義では、任意の深さでnull要素が許可されることに注意してください。

指定された配列のいずれかに、1つ以上のレベルの配列を介して直接的または間接的に要素として含まれている場合、このメソッドの動作は未定義です。

21
Marcelo

Java.util.Arrays.equals

   /**
     * Returns <tt>true</tt> if the two specified arrays of Objects are
     * <i>equal</i> to one another.  The two arrays are considered equal if
     * both arrays contain the same number of elements, and all corresponding
     * pairs of elements in the two arrays are equal.  Two objects <tt>e1</tt>
     * and <tt>e2</tt> are considered <i>equal</i> if <tt>(e1==null ? e2==null
     * : e1.equals(e2))</tt>.  In other words, the two arrays are equal if
     * they contain the same elements in the same order.  Also, two array
     * references are considered equal if both are <tt>null</tt>.<p>
     *
     * @param a one array to be tested for equality.
     * @param a2 the other array to be tested for equality.
     * @return <tt>true</tt> if the two arrays are equal.
     */
    public static boolean equals(Object[] a, Object[] a2) 
9
adarshr

配列を比較するには、Arrays.equalsメソッドを使用します。

if (Arrays.equals(array1, array2))
{    
  // array1 and array2 contain the same elements in the same order
}
3
Kyle

投稿した例では、配列には実際にIntegerオブジェクトが含まれます。その場合、Arrays.equals()で十分です。ただし、配列にいくつかのオブジェクトが含まれている場合、equals()が機能するように、クラスにArrays.equals()を実装する必要があります

2
Op De Cirkel

一般に、ユーティリティクラス Java.util.Arrays は非常に便利です。

  • 2つの配列が等しいと見なされる場合、両方の配列には同じ数の要素が含まれ、2つの配列の要素のすべてのペアは等しく使用されますArrays.equals
  • 2つの配列参照が両方ともnullの場合、またはそれらが同じ数の要素を含む配列を参照し、2つの配列内の対応するすべての要素のペアが完全に等しいと見なされる場合は、使用- Arrays.deepEquals。この方法は、任意の深さのネストされた配列での使用に適しています。
0
zacheusz

array1.equals(array2)はあなたが探しているものを与えるはずです。

0
user756212