Chciałbym sprawdzić, czy dwa pakiety są równe, czy jest jakiś sposób to zrobić, zamiast sprawdzać klucz po klawiszu?Sprawdź, czy dwa obiekty pakietu są równe w systemie Android?
Odpowiedz
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 wtwo
- 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;
}
Ś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
To również powinno wykonać zerową kontrolę pakietów przed wywołaniem bundle.size(), aby uniknąć NPE. – Chris6647
Jeśli obie wartości są 'bundle' i równe, to nadal jest wywoływany test' if (! ValueOne.equals (valueTwo)) ', który jest niepoprawny. –
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;
}
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
}
Nie będzie to działać? http://developer.android.com/reference/java/lang/Object.html#writing_equals – Simon
Nie można przesłonić 'Bundle', ponieważ jest to' final'. – pixel
Ach, dobry punkt :) – Simon