сравнение объектов намерений Android - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть 2 объекта-намерения Android, которые можно сохранить в виде URL-адресов, а затем перевести обратно в объекты-намерения.Мне интересно, каков наиболее эффективный способ сравнить любые 2 объекта намерения, чтобы убедиться, что они в конечном итоге разрешают одно и то же действие с одинаковыми параметрами и т. Д. Использование intent.filterEquals делает это, но не включает в себя дополнительные функции.

В настоящее время мой код для метода equals выглядит следующим образом:

            Intent a = Intent.parseUri(this.intentUrl,
                    Intent.URI_INTENT_SCHEME);

            Intent b = Intent.parseUri(other.intentUrl,
                    Intent.URI_INTENT_SCHEME);
            if (a.filterEquals(b)) {
                if (a.getExtras() != null && b.getExtras() != null) {
                    for (String key : a.getExtras().keySet()) {
                        if (!b.getExtras().containsKey(key)) {
                            return false;
                        } else if (!a.getExtras().get(key)
                                .equals(b.getExtras().get(key))) {
                            return false;

                        }
                    }
                }
                // all of the extras are the same so return true
                return true;
            } else { return false; }

Но есть ли лучший / более чистый способ?

Ответы [ 3 ]

3 голосов
/ 02 ноября 2011

Это, вероятно, так же хорошо, как и получается, по крайней мере, концептуально. Тем не менее, я не думаю, что ваш алгоритм охватывает случаи, когда b имеет ключ, которого нет у a.

Я бы получил оба значения keySet() и запустил бы equals() для них, чтобы подтвердить, что у них обоих одинаковые ключи. Затем выполните итерацию по одному и запустите equals() для пары значений.

2 голосов
/ 18 ноября 2016

Улучшение ответа @aostiles путем добавления пропущенного оператора return, а также условий для сравнения массивов в дополнениях:

private boolean intentsAreEqual (Intent a, Intent b)
    {
        if (a.filterEquals(b)) {
            if (a.getExtras() != null && b.getExtras() != null) {
                // check if the keysets are the same size
                if (a.getExtras().keySet().size() != b.getExtras().keySet().size()) return false;
                // compare all of a's extras to b
                for (String key : a.getExtras().keySet()) {
                    if (!b.getExtras().containsKey(key)) {
                        return false;
                    }
                    else if (a.getExtras().get(key).getClass().isArray() && b.getExtras().get(key).getClass().isArray()) {
                        if (!Arrays.equals((Object[]) a.getExtras().get(key), (Object[]) b.getExtras().get(key))) {
                            return false;
                        }
                    }
                    else if (!a.getExtras().get(key).equals(b.getExtras().get(key))) {
                        return false;
                    }
                }
                // compare all of b's extras to a
                for (String key : b.getExtras().keySet()) {
                    if (!a.getExtras().containsKey(key)) {
                        return false;
                    }
                    else if (b.getExtras().get(key).getClass().isArray() && a.getExtras().get(key).getClass().isArray()) {
                        if (!Arrays.equals((Object[]) b.getExtras().get(key), (Object[]) a.getExtras().get(key))) {
                            return false;
                        }
                    }
                    else if (!b.getExtras().get(key).equals(a.getExtras().get(key))) {
                        return false;
                    }
                }
                return true;
            }
            if (a.getExtras() == null && b.getExtras() == null)
            {
                return true;
            }
            // either a has extras and b doesn't or b has extras and a doesn't
            return false;
        }
        else
        {
            return false;
        }
    }
1 голос
/ 14 августа 2012

Это в значительной степени реализация того, что было предложено CommonsWare в сочетании с кодом Бена, но также охватывает случай, когда либо a имеет дополнительные функции, а b не имеет или b имеет дополнительные функции, а a - нет.

private boolean areEqual(Intent a, Intent b) {
    if (a.filterEquals(b)) {
        if (a.getExtras() != null && b.getExtras() != null) {
            // check if the keysets are the same size
            if (a.getExtras().keySet().size() != b.getExtras().keySet().size()) return false;
            // compare all of a's extras to b
            for (String key : a.getExtras().keySet()) {
                if (!b.getExtras().containsKey(key)) {
                    return false;
                } else if (!a.getExtras().get(key).equals(b.getExtras().get(key))) {
                    return false;
                }
            }
            // compare all of b's extras to a
            for (String key : b.getExtras().keySet()) {
                if (!a.getExtras().containsKey(key)) {
                    return false;
                } else if (!b.getExtras().get(key).equals(a.getExtras().get(key))) {
                    return false;
                }
            }
        }
        if (a.getExtras() == null && b.getExtras() == null) return true;
        // either a has extras and b doesn't or b has extras and a doesn't
        return false;
    } else {
        return false;
    }
}
...