Проверьте, содержит ли ArrayList данный объект

Предполагая, что у меня есть класс:

class A {
  int elementA;
  int elementB
}

У меня также есть ArrayList: ArrayList<A> listObj.

Как я могу проверить, содержит ли этот список объект, используя только некоторые из свойств A? Например, рассматривая только elementA для нахождения, если объект newA{elementA} уже находится в списке?

Для объекта A я определил метод equals, где я рассматриваю только elementA, однако этого недостаточно.

Ответы

Ответ 1

Метод списка содержит() использует метод equals() для оценки того, являются ли два объекта одинаковыми. Итак, вы должны переопределить equals() в своем классе A, а также переопределить hashCode().

@Override
public boolean equals(Object object)
{
    boolean isEqual= false;

    if (object != null && object instanceof A)
    {
        isEqual = (this.elementA == ((A) object).elementA);
    }

    return isEqual;
}

@Override
public int hashCode() {
    return this.elementA;
}

Ответ 2

Вы можете адаптировать свой equals для размещения в соответствии с вашими потребностями, но вы также можете использовать одну из мощных библиотек коллекции, которые уже существуют, например commons-collections, Guava или lambdaj, Все они имеют конструкции итераций и предикатов, которые позволяют вам "исследовать" ваши коллекции на основе некоторого предиката.

Пример с коллекциями Commons:

boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() {
    public boolean evaluate(A theA) {
        // Do the comparison
    }
});

Ответ 3

Массивы hashCode() и equals() немного сломаны, когда дело доходит до этого (почему-то давно обсуждается).

Возможная работа заключается в использовании ArrayList<ArrayList<String>> вместо ArrayList<String[]>, метод equals() для ArrayList будет таким, как вы ожидаете.

Например:

   ArrayList<String> l1 = new ArrayList<>();
    ArrayList<String> l2 = new ArrayList<>();
    l1.add("asdf");
    l2.add("asdf");
    ArrayList<ArrayList<String>> coll = new ArrayList<>();
    coll.add(l1);
    System.out.println(coll.contains(l2));

Уступит true, как ожидалось

Также см. ниже ссылку

Самый эффективный способ увидеть, содержит ли ArrayList объект в Java

Ответ 4

Я бы не переопределял equals для этого. Даже если {1, 1} и {1, 2} не могут встречаться в вашем списке, два объекта не равны.

Вместо этого я использовал бы Map:

Map<Integer, A> map = new HashMap<>();
A a1 = new A(1, 1);
A a2 = new A(1, 2);

map.put(a1.elementA, a1);

// test if key is contained
boolean contains = map.containsKey(a2.elementA);

// overwrite a1 with a2
map.put(a2.elementA, a2);

Ответ 5

Все вышеуказанное решение удовлетворит ваш вопрос. Что я хотел бы предложить вам здесь? Когда вы когда-либо используете коллекцию, всегда добавляйте свой переменный тип данных в свой суперкласс. который поможет вам сделать больше манипуляций и преобразовать их в любой из своих подклассов.

Ex:
List<String> myList = new ArrayList<String>();

Преимущество в том, что реализация списка может измениться (например, в LinkedList), не затрагивая остальную часть кода. Это будет сложно сделать с ArrayList не только потому, что вам придется менять ArrayList на LinkedList всюду, но также и потому, что вы, возможно, использовали специальные методы ArrayList.

Ответ 7

List<Upload> mUploadPost = new ArrayList<Upload>();
Upload upload = new Upload();
upload.addName("Mpendulo");
upload.addLastName("Mtshali");
if(!mUploadPost.contains(upload)){
    mUploadPost.add(upload);
}