Проверьте, содержит ли 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.
Ответ 6
Для сравнения значения объекта в arrayList
.
Перейдите по этой ссылке.
Как сравнить атрибуты объектов в 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);
}