2012-11-05 3 views

Odpowiedz

28

Oto jeden sposób, aby sprawdzić, czy dwie wiązki są takie same:

  • Sprawdź swoje rozmiary, nie przejmuj się, jeśli nie są one równe
  • Jeśli obie wartości są Bundle obiekty używające rekurencji
  • Ponieważ wartość dla klucza w one może być null, upewnij się, że obie wartości są null i że kluczem faktycznie istnieje w two
  • Wreszcie porównać wartości

Kod:

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

Świetna metoda, może również zadeklarować to jako 'static'. Następnie umieść go w klasie utils, jeśli twój projekt go dużo używa. – Jon

+0

To również powinno wykonać zerową kontrolę pakietów przed wywołaniem bundle.size(), aby uniknąć NPE. – Chris6647

+0

Jeśli obie wartości są 'bundle' i równe, to nadal jest wywoływany test' if (! ValueOne.equals (valueTwo)) ', który jest niepoprawny. –

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

Co się stanie, jeśli w pakiecie 'Bundle' znajduje się' Bundle'? Używaj tego rekursywnie? – pixel

+0

Tak, dodaj jeszcze jedną "if" wewnątrz "for" i sprawdź, czy wartość instancji pakietu. – Ivan

+0

Czy możesz zaktualizować odpowiedź, więc mogę ją zaakceptować? :) – pixel

0

Ja testowałem Sam „Klawisze Dopasowany s odpowiedź i zawiera wadę. Poza tym kocham w tej chwili Kotlina, więc oto moja wersja.

  • Ponownie zestawy klucze muszą być tej samej wielkości
  • Kluczowe zestawy muszą mieć te same wartości
  • Jeżeli obie wartości są Bundle następnie przetestować rekurencyjnie.
  • Inaczej wartości testowe dla równości (nie ponownie przetestować zestawy)

Kod:

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 
}