Самый эффективный способ узнать, содержит ли ArrayList объект в Java - PullRequest
70 голосов
/ 18 февраля 2009

У меня есть ArrayList объектов в Java. У объектов есть четыре поля, два из которых я бы использовал, чтобы считать объект равным другому. Я ищу наиболее эффективный способ, учитывая эти два поля, чтобы увидеть, содержит ли массив этот объект.

Ключ в том, что эти классы генерируются на основе объектов XSD, поэтому я не могу изменить сами классы, чтобы перезаписать .equals.

Есть ли лучший способ, чем просто циклически проходить и вручную сравнивать два поля для каждого объекта, а затем разрывать при обнаружении? Это просто кажется грязным в поисках лучшего пути.

Редактировать: ArrayList поступает из SOAP-ответа, который распаковывается в объекты.

Ответы [ 12 ]

1 голос
/ 18 февраля 2009

Создание HashMap из этих объектов на основе значения поля в качестве ключа может быть целесообразным с точки зрения производительности, например заполняйте Карты один раз и очень эффективно находите объекты

0 голосов
/ 18 февраля 2009

Я бы сказал, что самым простым решением было бы обернуть объект и делегировать вызов содержимого коллекции обернутого класса. Это похоже на компаратор, но не заставляет вас сортировать полученную коллекцию, вы можете просто использовать ArrayList.contains ().

public class Widget {
        private String name;
        private String desc;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }
    }



    public abstract class EqualsHashcodeEnforcer<T> {

        protected T wrapped;

        public T getWrappedObject() {
            return wrapped;
        }

        @Override
        public boolean equals(Object obj) {
            return equalsDelegate(obj);
        }

        @Override
        public int hashCode() {
            return hashCodeDelegate();
        }

        protected abstract boolean equalsDelegate(Object obj);

        protected abstract int hashCodeDelegate();
    }


    public class WrappedWidget extends EqualsHashcodeEnforcer<Widget> {

        @Override
        protected boolean equalsDelegate(Object obj) {
            if (obj == null) {
                return false;
            }
            if (obj == getWrappedObject()) {
                return true;
            }
            if (obj.getClass() != getWrappedObject().getClass()) {
                return false;
            }
            Widget rhs = (Widget) obj;

            return new EqualsBuilder().append(getWrappedObject().getName(),
                    rhs.getName()).append(getWrappedObject().getDesc(),
                    rhs.getDesc()).isEquals();
        }

        @Override
        protected int hashCodeDelegate() {

            return new HashCodeBuilder(121, 991).append(
                    getWrappedObject().getName()).append(
                    getWrappedObject().getDesc()).toHashCode();
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...