次のような2つのオブジェクト配列があります。
Object[] array1 = {0, 1, 2, 3};
Object[] array2 = {0, 1, 2, 3};
配列が等しいかどうか知りたいのですが。 array1のすべての値は、array2のその位置の値と同じであるため、等しいと定義しています。したがって、これらの2つの配列は等しくなります。
これらの2つの配列が等しいかどうかを確認する最良の理由は何ですか?
if(array1 == array2)
は深い等式ではないため、機能しません。各要素をループして比較することが、この問題を解決するための最良かつ最も効率的な方法であるかどうかはわかりません。誰かより良い提案がありますか?
編集:入れ子になった配列に入ることができる等号が必要でした。
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つ以上のレベルの配列を介して直接的または間接的に要素として含まれている場合、このメソッドの動作は未定義です。
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)
配列を比較するには、Arrays.equalsメソッドを使用します。
if (Arrays.equals(array1, array2))
{
// array1 and array2 contain the same elements in the same order
}
投稿した例では、配列には実際にInteger
オブジェクトが含まれます。その場合、Arrays.equals()
で十分です。ただし、配列にいくつかのオブジェクトが含まれている場合、equals()
が機能するように、クラスにArrays.equals()
を実装する必要があります
一般に、ユーティリティクラス Java.util.Arrays は非常に便利です。
array1.equals(array2)
はあなたが探しているものを与えるはずです。