2016-12-22 13 views
6

Im folgenden Code würde ich equals() erwarten, true zurückgeben, aber es tut es nicht. Was fehlt mir hier?SparseBooleanArray.equals() funktioniert nicht wie erwartet

SparseBooleanArray array_0 = new SparseBooleanArray(); 
    array_0.put(0, true); 
    array_0.put(2, true); 

    SparseBooleanArray array_1 = new SparseBooleanArray(); 
    array_1.put(0, true); 
    array_1.put(2, true); 

    boolean isEqual = array_0.equals(array_1); // is false instead of true 

an beiden Array im Debugger Blick scheint sie mich gleich (sie haben einen anderen shadow$_monitor_ Wert, aber ich habe keine Ahnung, was das sein sollte). Die Methode toString() gibt für beide die gleiche Zeichenfolge zurück.

Ich versuche, einen Komponententest für eine Funktion zu schreiben, die eine EnumSet in eine SparseBooleanArray konvertiert, aber ich kann das gleiche Array nicht manuell erstellen, um es mit dem Rückgabewert der Funktion zu vergleichen.


bearbeiten

ich auch, dass hasCode() gibt unterschiedliche Werte als auch erwähnen sollte, die nicht auf der documentation basieren sollte.

+0

Das ist sehr seltsam ist. Ich kann Ihre Ergebnisse reproduzieren, aber der Quellcode sieht aus wie sie übereinstimmen sollten ... – CommonsWare

+1

auf welcher Android-Version testen Sie es? – Blackbelt

+0

@Blackbelt On Android 6.0 API 23 - x86_64 Emulator – rozina

Antwort

0

Mit Blick auf den Quellcode sowohl die equals und hashCode Methoden implementiert sind nicht für SparseBooleanArray, SparseIntArray, SparseLongArray und SparseArray. Ich würde sagen, dass dies eine wichtige fehlende Funktion ist und Google gemeldet werden sollte.

Wie dem auch sei, ich benutze seit geraumer Zeit diese Dienstprogramm Methoden, um dieses Problem zu lösen:

public static boolean equals(SparseArray arrayOne, SparseArray arrayTwo){ 
    if(arrayOne == arrayTwo){ 
     return true; 
    } else if(arrayOne.size() != arrayTwo.size()){ 
     return false; 
    } 
    for(int i = 0; i < arrayOne.size(); i++){ 
     if(arrayOne.keyAt(i) != arrayTwo.keyAt(i)){ 
      return false; 
     } 
     final Object valueOne = arrayOne.valueAt(i); 
     final Object valueTwo = arrayTwo.valueAt(i); 
     if(valueOne != null && !valueOne.equals(valueTwo)){ 
      return false; 
     } else if(valueTwo != null && !valueTwo.equals(valueOne)){ 
      return false; 
     } 
    } 
    return true; 
} 

public static boolean equals(SparseBooleanArray arrayOne, SparseBooleanArray arrayTwo){ 
    if(arrayOne == arrayTwo){ 
     return true; 
    } else if(arrayOne.size() != arrayTwo.size()){ 
     return false; 
    } 
    for(int i = 0; i < arrayOne.size(); i++){ 
     if(arrayOne.keyAt(i) != arrayTwo.keyAt(i)){ 
      return false; 
     } else if(arrayOne.valueAt(i) != arrayTwo.valueAt(i)){ 
      return false; 
     } 
    } 
    return true; 
} 

public static boolean equals(SparseIntArray arrayOne, SparseIntArray arrayTwo){ 
    if(arrayOne == arrayTwo){ 
     return true; 
    } else if(arrayOne.size() != arrayTwo.size()){ 
     return false; 
    } 
    for(int i = 0; i < arrayOne.size(); i++){ 
     if(arrayOne.keyAt(i) != arrayTwo.keyAt(i)){ 
      return false; 
     } else if(arrayOne.valueAt(i) != arrayTwo.valueAt(i)){ 
      return false; 
     } 
    } 
    return true; 
} 

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) 
public static boolean equals(SparseLongArray arrayOne, SparseLongArray arrayTwo){ 
    if(arrayOne == arrayTwo){ 
     return true; 
    } else if(arrayOne.size() != arrayTwo.size()){ 
     return false; 
    } 
    for(int i = 0; i < arrayOne.size(); i++){ 
     if(arrayOne.keyAt(i) != arrayTwo.keyAt(i)){ 
      return false; 
     } else if(arrayOne.valueAt(i) != arrayTwo.valueAt(i)){ 
      return false; 
     } 
    } 
    return true; 
} 

Es ist jedoch auch möglich (wie in den Kommentaren erwähnt) und möglicherweise besser, die SparseArray Klasse, Unterklasse und überschreiben Sie die Methoden equals und hashCode.

Haftungsausschluss: ich nicht die hashCode oder equals Umsetzung der unten angegebenen Code testen haben, schreiben Sie einige Tests selbst sicherzustellen, dass es richtig funktioniert. #DontTrustTheInternet

public class SparseBooleanArray extends android.util.SparseBooleanArray { 

    @Override 
    public boolean equals(Object o) { 
     if(!(o instanceof SparseBooleanArray)){ 
      return false; 
     } else if(this == o){ 
      return true; 
     } 
     final SparseBooleanArray other = (SparseBooleanArray) o; 
     if(size() != other.size()){ 
      return false; 
     } 
     for(int i = 0; i < size(); i++){ 
      if(keyAt(i) != other.keyAt(i)){ 
       return false; 
      } else if(valueAt(i) != other.valueAt(i)){ 
       return false; 
      } 
     } 
     return true; 
    } 

    @Override 
    public int hashCode() { 
     int result = 17; 
     for(int i = 0; i < size(); i++){ 
      result = 31 * result + keyAt(i); 
      result = 31 * result + (valueAt(i)?1:0); 
     } 
     return result; 
    } 
} 
Verwandte Themen