检查Android中两个Bundle对象是否相等?

pix*_*xel 9 android bundle

我想检查两个捆绑包是否相等,有没有办法做到这一点,而不是按密钥检查它们?

Sam*_*Sam 29

这是测试两个Bundles是否相同的一种方法:

  • 检查它们的尺寸,如果它们不相等则不要打扰
  • 如果两个值都是Bundle对象,则使用递归
  • 因为键入的值one可以是null,请确保这两个值都是null,并且键实际存在two
  • 最后比较匹配键的值

码:

public boolean equalBundles(Bundle one, Bundle two) {
    if(one.size() != two.size())
        return false;

    Set<String> setOne = new HashSet<>(one.keySet());
    setOne.addAll(two.keySet());
    Object valueOne;
    Object valueTwo;

    for(String key : setOne) {
        if (!one.containsKey(key) || !two.containsKey(key))
            return false;

        valueOne = one.get(key);
        valueTwo = two.get(key);
        if(valueOne instanceof Bundle && valueTwo instanceof Bundle && 
                !equalBundles((Bundle) valueOne, (Bundle) valueTwo)) {
            return false;
        }
        else if(valueOne == null) {
            if(valueTwo != null)
                return false;
        }
        else if(!valueOne.equals(valueTwo))
            return false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 好的方法,最好也声明为“ static”。如果您的项目经常使用它,则将其包含在utils类中。 (2认同)
  • 如果两个值都是“ bundle”并且相等,则仍然会调用“ if(!valueOne.equals(valueTwo))”测试,这是不正确的。 (2认同)

Sim*_*one 7

我已经测试了Sam的答案,它包含一个缺陷。另外我现在很喜欢 Kotlin,所以这是我的版本。

  • 再次,键集需要相同的大小
  • 键集需要具有相同的值
  • 如果两个值都被Bundle递归测试。
  • 否则测试相等的值(不要重新测试包)

代码:

fun equalBundles(one: Bundle, two: Bundle): Boolean {
    if (one.size() != two.size())
        return false

    if (!one.keySet().containsAll(two.keySet()))
        return false

    for (key in one.keySet()) {
        val valueOne = one.get(key)
        val valueTwo = two.get(key)
        if (valueOne is Bundle && valueTwo is Bundle) {
            if (!equalBundles(valueOne , valueTwo)) return false
        } else if (valueOne != valueTwo) return false
    }

    return true
}
Run Code Online (Sandbox Code Playgroud)


Iva*_*van 5

private static boolean equalsBundles(Bundle a, Bundle b) {
        Set<String> aks = a.keySet();
        Set<String> bks = b.keySet();

        if (!aks.containsAll(bks)) {
            return false;
        }

        for (String key : aks) {
            if (!a.get(key).equals(b.get(key))) {
                return false;
            }
        }

        return true;
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果在"Bundle"里面有一个`Bundle`怎么办?递归使用它? (4认同)