2011-10-23 83 views
9

我有未知類型的兩列...有沒有辦法來檢查元素都是相同的:的Java數組比較

public static boolean equals(Object a , Object b) { 
    if (a instanceof int[]) 
    return Arrays.equals((int[]) a, (int[])b); 
    if (a instanceof double[]){ 
    ////etc 
} 

我想這樣做沒有所有的instanceof檢查....

+0

增加了一些方法聲明部分(公共靜態...) - 否則它會像ruby方法調用通過的塊一樣查找我:-) – Vladimir

回答

16

ArrayUtils.isEquals()Apache Commons確實如此。它也處理多維數組。

+2

對此使用非核心庫是否有任何好處?如果不是,最好用標準Arrays.equals代替。我只是不會混淆任何尋找所選答案的人。使用標準方法比Apache Commons更自然。我選擇Arrays.equals而不是 – Vladimir

+2

好吧 - 看起來問題是,使用Arrays.equals和Arrays.deepEquals時,不能像ArrayUtils.isEquals中那樣將對象傳遞爲對象 - 現在就明白了。 – Vladimir

11

你應該嘗試Arrays.deepEquals(a, b)

0

如果數組類型是未知的,你不能簡單地轉換爲Object[],因此在java.util.Arrays不能使用方法(equalsdeepEquals)。
但是,您可以使用反射來獲取數組的長度和項目,並遞歸地比較它們(項目可能是數組本身)。

這裏有一個一般實用的方法來比較兩個對象(數組也支持),它允許一個或甚至兩者爲空:

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); 
}