13

2 つのバンドルが等しいかどうかを確認したいのですが、キーごとに確認する代わりにそれを行う方法はありますか?

4

5 に答える 5

31

2つのバンドルが同じかどうかをテストする1つの方法は次のとおりです。

  • それらのサイズを確認し、等しくない場合は気にしないでください
  • 両方の値がバンドルオブジェクトの場合、再帰を使用します
  • キー入力の値はである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;
}
于 2012-11-05T19:11:46.380 に答える
6
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;
    }
于 2012-11-05T15:30:15.793 に答える
-1

1 行の方法:

 static boolean isEqualBundle(Bundle a, Bundle b) {
    return a == b || (a != null && b != null && a.keySet().equals(b.keySet()) && a.keySet().stream().allMatch(s -> Objects.equals(a.get(s), b.get(s))));
}

static boolean isDeepEqualBundle(Bundle a, Bundle b) {
    return a == b || (a != null && b != null && a.keySet().equals(b.keySet()) && a.keySet().stream().map(s -> new Pair<>(a.get(s), b.get(s))).allMatch(s -> s.first instanceof Bundle && s.second instanceof Bundle ? isDeepEqualBundle((Bundle) s.first, (Bundle) s.second) : Objects.equals(s.first, s.second)));
}

//テストケース

    final Bundle a = new Bundle(), b = new Bundle(), c = new Bundle(), d = new Bundle(), e = new Bundle(), f = new Bundle(), aa = new Bundle(), bb = new Bundle(), cc = new Bundle();
    a.putString("1", "A");
    b.putString("1", "A");
    c.putString("1", "C");
    d.putString("1", null);
    e.putString("1", null);
    f.putString("2", null);


    aa.putString("2", "A");
    aa.putBundle("2", a);
    bb.putString("2", "A");
    bb.putBundle("2", b);
    cc.putString("2", "C");
    cc.putBundle("2", c);

    boolean isEquals1 = isEqualBundle(a, b); //true
    boolean isEquals2 = isEqualBundle(a, c); //false
    boolean isEquals3 = isEqualBundle(d, e); //true
    boolean isEquals4 = isEqualBundle(d, f); //false
    boolean isEquals5 = isEqualBundle(aa, bb); //false
    boolean isEquals6 = isEqualBundle(aa, cc); //false
    boolean isEquals7 = isDeepEqualBundle(aa, bb); //true
    boolean isEquals8 = isDeepEqualBundle(aa, cc); //false
于 2020-09-21T07:06:30.820 に答える