2012-11-05 59 views

回答

28

這裏有一種方法來測試,如果兩束是相同的:

  • 檢查它們的大小,不要打擾,如果他們不相等
  • 如果兩個值捆紮物體使用遞歸
  • 因爲在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; 
} 
+1

偉大的方法,不妨也聲明它是'static'。如果你的項目使用它很多,然後將它包含在一個utils類中。 – Jon

+0

在調用bundle.size()以避免NPE之前,這也應該對Bundles本身進行空檢查。 – Chris6647

+0

如果兩個值都是'bundle'並且相等,那麼'if(!valueOne.equals(valueTwo))'測試仍然被調用,這是不正確的。 –

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

如果Bundle裏面有Bundle,怎麼辦?遞歸使用它? – pixel

+0

是的,在「for」裏添加一個「if」,並檢查Bundle的值實例。 – Ivan

+0

你能更新答案嗎,我可以接受嗎? :) – pixel

0

我已經測試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 
}