2015-05-12 11 views
6

Per il mio metodo di uguaglianza che controlla se due array sono uguali, il primo metodo "uguaglia" effettivamente controlla se i due array sono uguali o verifica solo gli indirizzi di memoria? O dovrei includere entrambi?equivale a metodi quando si utilizzano gli array java

public boolean equals(Object otherObject) 
    { 
     if (otherObject == null) 
     { 
      return false; 
     } 
     else if (getClass() != otherObject.getClass()) 
     { 
      return false; 
     } 
     else 
     { 
      RegressionModel otherRegressionModel = (RegressionModel)otherObject; 
      return (xValues == (otherRegressionModel.xValues) && yValues == (otherRegressionModel.yValues)); 
     } 
    } 

O

public static boolean equalArrays(double[] x, double[] y) 
{ 
    if(x.length != y.length) 
    { 
     return false; 
    } 
    else 
    { 
     for(int index = 0; index < x.length; index++) 
     { 
      if (x[index] != y[index]) 
      { 
       return false; 
      } 
     } 
     return true;    
    } 
} 
+7

O [ 'Arrays.equals'] (https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#equals (double [],% 20double [])) ...? – MadProgrammer

+0

@MadProgrammer Sì, ma voglio sovrascriverlo e crearlo da solo – rreg101

+0

@ rreg101 Va bene, ma forse dovresti iniziare osservando il codice sorgente del metodo suggerito da MadProgrammer. – Mecon

risposta

2

all'operatore =/!= confronta matrici basate sui loro riferimento, e non il loro contenuto. Chiaramente, due array possono avere gli stessi elementi, eccetto che sono ancora due oggetti distinti che vengono creati nella memoria. Gli array sono due riferimenti. Pertanto il tuo metodo secondo deve essere applicato, perché confronta gli elementi effettivi all'interno dei due array. Inoltre non hai bisogno della tua istruzione else.

public static boolean equalArrays(double[] x, double[] y) 
{ 
    if(x.length != y.length) 
    { 
     return false; 
    } 
    for (int index = 0; index < x.length; index++) 
    { 
     if (x[index] != y[index]) 
     { 
      return false; 
     } 
    } 
    return true;    
} 
1

Un altro controllo può essere applicato anche sul metodo first equals in cui è possibile visualizzare entrambi gli array con lo stesso riferimento oppure no. Quindi si può fare un altro confronto. Nel secondo metodo controlla sempre l'elemento di un array, anche se sia un riferimento della stessa matrice. quindi in termini di prestazioni ci vorrà del tempo.

public boolean equals(Object otherObject) 
    { 
     if (otherObject == null) 
     { 
      return false; 
     } 
     else if (getClass() != otherObject.getClass()) 
     { 
      return false; 
     } else if (this != otherObject) 
      return false; 
     } 
     else 
     { 
      RegressionModel otherRegressionModel =      (RegressionModel)otherObject; 
      return (xValues == (otherRegressionModel.xValues) && yValues == (otherRegressionModel.yValues)); 
     } 
    } 
1

Aggiungendo a @ risposta di Henry, prima di confrontare lunghezze delle due date array è necessario assicurarsi che nessuno di loro sono null in modo che non si ottiene un NullPointerException.

Si potrebbe anche voler confrontare i riferimenti degli array prima di passare in rassegna i loro elementi.

Qualcosa di simile a questo:

public static boolean equalArrays(double[] x, double[] y) 
{ 
    if (x == null || y == null || x.length != y.length) 
    { 
     //NOTE: That if both x and y are null we return false despite the fact that you could argue that they are equal 
     return false; 
    } 
    if (x == y) 
    { 
     return true; 
    } 
    for (int index = 0; index < x.length; index++) 
    { 
     if (x[index] != y[index]) 
     { 
      return false; 
     } 
    } 
    return true;    
} 
Problemi correlati