2011-10-23 14 views
9

Mam dwie tablice nieznanego typu ... czy jest jakiś sposób, aby sprawdzić elementy są takie same:Java porównujące Tablice

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

Chcę to zrobić bez wszystkich kontroli instanceof ....

+0

Dodane niektóre części deklaracji metody (public static ...) - w przeciwnym razie wyglądało to na wywołanie metody ruby ​​z przekazanym blokiem :-) – Vladimir

Odpowiedz

16

z Apache Commons robi dokładnie to. Obsługuje również wielowymiarowe tablice.

+2

Czy jest jakaś korzyść z zastosowania do tego biblioteki non-core? Jeśli nie, lepiej jest użyć standardowego pliku Arrays.equals. Po prostu nie chcę mylić żadnych osób, które szukają wybranej odpowiedzi. Bardziej naturalnie jest używać standardowej metody niż ta z Apache Commons. Wybieram Arrays.equals zamiast: – Vladimir

+2

Okay - wygląda na to, że z Arrays.equals i Arrays.deepEquals nie można przekazywać tablic jako obiektów takich jak w ArrayUtils.isEquals - masz to teraz. – Vladimir

11

Należy spróbować Arrays.deepEquals(a, b)

0

Jeśli typ tablicy jest nieznany, nie można po prostu rzucać się Object[], a zatem nie może korzystać z metod (equals, deepEquals) w java.util.Arrays.
Można jednak użyć odbicia, aby uzyskać długość i elementy tablic i porównać je rekursywnie (elementy mogą same być tablicami).

Oto metoda ogólnie narzędzie do porównywania dwóch obiektów (tablice są również obsługiwane), które pozwala jednej lub nawet zarówno do być null:

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