2011-10-23 18 views
9

Ho due array di tipo sconosciuto ... c'è un modo per controllare gli elementi sono gli stessi:Java confronto Array

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

che voglio fare questo senza tutti i controlli instanceof ....

+0

aggiunte alcune parti dichiarazione metodo (public static ...) - altrimenti mi ha cercato come chiamata al metodo ruby ​​con blocco passato :-) – Vladimir

risposta

16

ArrayUtils.isEquals() da Apache Commons fa esattamente quello. Gestisce anche gli array multidimensionali.

+2

C'è qualche vantaggio nell'usare la libreria non core per questo? Altrimenti, è meglio andare con gli standard Arrays.equals. Semplicemente non voglio confondere le persone che cercano la risposta selezionata. Sembra più naturale usare un metodo standard rispetto a quello di Apache Commons. Scelgo Arrays.equals invece – Vladimir

+2

Ok: sembra che il problema sia che con Arrays.equals e Arrays.deepEquals non è possibile passare gli array come oggetti come in ArrayUtils.isEquals - lo hai ottenuto ora. – Vladimir

11

Si dovrebbe cercare Arrays.deepEquals(a, b)

0

Se il tipo di array è sconosciuto, non si può semplicemente lanciare a Object[], e quindi non possono utilizzare i metodi (equals, deepEquals) in java.util.Arrays.
È tuttavia possibile utilizzare la riflessione per ottenere la lunghezza e gli elementi degli array e confrontarli in modo ricorsivo (gli elementi possono essere gli stessi array).

Ecco un metodo generale utilità per confrontare due oggetti (array sono supportati anche), che permette uno o addirittura entrambi essere nullo:

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