2011-10-23 21 views
9

私は未知のタイプの2つの配列を持っている...要素が同じでチェックする方法があります:Javaの比較配列

私はすべてのinstanceofチェックせずにこれを行うにはしたく
public static boolean equals(Object a , Object b) { 
    if (a instanceof int[]) 
    return Arrays.equals((int[]) a, (int[])b); 
    if (a instanceof double[]){ 
    ////etc 
} 

....

+0

は、いくつかのメソッドの宣言部(パブリック静的...)を添加それ以外の場合は、渡されたブロック:-)でルビーメソッド呼び出しとして私を探しました – Vladimir

答えて

16

ArrayUtils.isEquals()Apache Commonsがそうです。また、多次元配列も扱います。

+2

これに非コアライブラリを使用する利点はありますか?もしそうでなければ、代わりに標準Arrays.equalsを使う方が良いでしょう。私は選択された答えを見ている人を混乱させることはありません。 Apache Commonsのものよりも標準的な方法を使うのが自然に感じられます。私はArrays.equalsを代わりに選択します – Vladimir

+2

問題はArrays.equalsとArrays.deepEqualsでArrayUtils.isEqualsのようにオブジェクトを渡すことができないように見えます。 – Vladimir

11

あなたは配列型が不明な場合、あなたは、単にObject[]にキャストすることはできませんので、java.util.Arraysにする方法(equalsdeepEquals)を使用することはできませんArrays.deepEquals(a, b)

0

を試してみてください。
しかし、リフレクションを使用して配列の長さとアイテムを取得し、それらを再帰的に比較することができます(アイテムは配列そのものかもしれません)。

ここに1つあるいは両方がヌルにすることができる二つのオブジェクトを(アレイもサポートされている)、比較する一般的なユーティリティメソッドの:

public static boolean equals (Object a, Object b) { 
    if (a == b) { 
     return true; 
    } 
    if (a == null || b == null) { 
     return false; 
    } 
    if (a.getClass().isArray() && b.getClass().isArray()) { 

     int length = Array.getLength(a); 
     if (length > 0 && !a.getClass().getComponentType().equals(b.getClass().getComponentType())) { 
      return false; 
     } 
     if (Array.getLength(b) != length) { 
      return false; 
     } 
     for (int i = 0; i < length; i++) { 
      if (!equals(Array.get(a, i), Array.get(b, i))) { 
       return false; 
      } 
     } 
     return true; 
    } 
    return a.equals(b); 
}