2016-12-22 26 views
6

Aşağıdaki kodda true dönmek için equals() beklerim, ancak değil. Burada neyi özlüyorum? ayıklayıcısında hem dizide baktığımızda SparseBooleanArray.equals() beklendiği gibi çalışmıyor

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 

, onlar (onlar farklı shadow$_monitor_ değere sahip ama bunun olması gerekiyordu hiçbir fikrim yok) bana aynı görünüyor. toString() yöntemi, her ikisi için de aynı dizeyi döndürür.

Bir EnumSet dosyasını SparseBooleanArray dönüştüren bir işlev için bir birim sınaması yazmaya çalışıyorum, ancak işlevin dönüş değeriyle karşılaştırmak için aynı diziyi el ile oluşturamıyorum.


Düzenleme

Şunu da belirtmek gerekir ki documentation dayalı olmamalıdır yanı hasCode() döner farklı değerler.

+0

. Bulgularınızı çoğaltabilirim, ancak kaynak kodu eşleşecek gibi görünüyor ... – CommonsWare

+1

Android'in hangi sürümünde test ediyorsunuz? – Blackbelt

+0

@Blackbelt On Android 6.0 API 23 - x86_64 öykünücüsü – rozina

cevap

0

kaynak kodu baktığımızda hem equals ve hashCode yöntemleri SparseBooleanArray, SparseIntArray, SparseLongArray ve SparseArray için uygulanmadı. Bunun önemli bir eksik özellik olduğunu ve Google’a bildirilmesi gerektiğini söyleyebilirim.

Neyse, bu sorunu çözmek için oldukça uzun bir süre için bu yardımcı program yöntemleri kullanın:

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

Ancak aynı zamanda (yorumlarda belirtildiği gibi) mümkün ve muhtemelen daha iyidir, SparseArray sınıfını alt sınıfı ve equals ve hashCode yöntemlerini geçersiz kılın.

Yasal Uyarı: Aşağıda verilen kod hashCode veya equals uygulanmasını test etmedi, doğru bir şekilde çalıştığından emin olmak için bazı testler kendiniz yazınız. çok garip O #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; 
    } 
}