gpt4 book ai didi

java - SparseBooleanArray.equals() 没有按预期工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:42:08 24 4
gpt4 key购买 nike

在下面的代码中,我希望 equals() 返回 true,但它没有。我在这里缺少什么?

    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

在调试器中查看这两个数组,它们对我来说似乎是一样的(它们有不同的 shadow$_monitor_ 值,但我不知道那应该是什么)。 toString() 方法也为两者返回相同的字符串。

我正在尝试为将 EnumSet 转换为 SparseBooleanArray 的函数编写单元测试,但我无法手动创建相同的数组来与它进行比较函数的返回值。


编辑

我还应该提到 hasCode() 也返回不同的值,这不应该基于 documentation .

最佳答案

查看源代码,equalshashCode 方法都没有为 SparseBooleanArraySparseIntArray 实现, SparseLongArraySparseArray。我想说这是一项关键的缺失功能,应该向 Google 报告。

无论如何,我使用这些实用方法已经有一段时间来解决这个问题:

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

然而,也可以(如评论中所述),并且可能更好地继承 SparseArray 类并覆盖 equalshashCode 方法。

Disclaimer: I did not test the hashCode or equals implementation of the code provided below, please write some tests yourself to make sure it works correctly. #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;
}
}

关于java - SparseBooleanArray.equals() 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41286059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com