Arraylist contains java не работает

Почему метод contains () в Java не работает должным образом?

Я пишу метод, который создает ArrayList S_Comp , который содержит все элементы, которые включены в массив allNodes , но которые не включены в ArrayList solution (чьи элементы все включены в allNodes ) . Когда я печатаю solution и allNodes , я легко вижу, что S_Comp должен содержать 7 элементов. Однако все элементы из allNodes добавляются в S_Comp , а также элементы, которые включены в nodesS . В чем может быть проблема здесь?

Ниже вы можете найти мой код для метода. Перед вызовом этого метода S_Comp был инициализирован только как new ArrayList , поэтому его размер равен 0.

3 ответа

public boolean содержит (объект o)

Возвращает true, если этот список содержит указанный элемент. Более формально, возвращает true тогда и только тогда, когда этот список содержит хотя бы один элемент e такой, что (o == null? E == null: o.equals (e)).

Поэтому он будет работать, только если вы переопределите метод equals класса объекта так, как вы хотите в классе MyNodesData . Более того, поскольку вы уже знаете контракт между equals () и методом hashcode (), настоятельно рекомендуется переопределить hashcode () вместе с equals () .

Содержит работы, как и ожидалось, он проверит, передал ли объект equals объект в списке. Так что, если вы не получаете ожидаемое поведение, потому что эти объекты не равны.

Читайте также:  Фиат добло не работает иммобилайзер

Вам нужно будет отладить этот код, чтобы проверить, почему equals не возвращает то, что вы ожидаете.

Изменить: я прочитал, что вы не переопределяете равно и хэш-код в классе MyNodesData, поэтому вы должны сделать это, как предлагают другие люди

Переопределите хэш-код и метод equals в классе MyNodesData, а затем проверьте.

Источник

Почему .contains возвращает false, когда я добавляю дубликат?

Я пишу простой метод для добавления объекта в ArrayList, если он еще не содержит его. Я использую метод .contains, но по какой-то причине, когда я добавляю дубликат объекта в ArrayList, метод .contains возвращает значение false, хотя я уже добавил этот объект в ArrayList.

Это мой City класс:

Когда у меня есть ArrayList , как это:

С одним добавленным объектом

Если я проверю, содержит ли он дублирующийся объект, как этот, он возвращает ложь

Спасибо за помощь!

3 ответа

Если вы хотите вставить в список только один объект City, используйте HashSet и переопределите методы equals () и hashCode () класса Object в своем классе City.

И твой Город класс:

Как работает метод contains , в соответствии с документация, так как использует Objects.equals(o, e) , где o — объект, который вы проверяете, существует в ArrayList и e — каждый элемент в массиве.

Objects.equals(a, b) сначала проверяет, является ли один из аргументов null , а затем использует a.equals(b) , чтобы проверить, совпадают ли они.

По умолчанию метод equals в Object просто выполняет a == b , который возвращает true, только если a является точно таким же объектом, что и b , т. Е. < > и b оба ссылаются на одно и то же место в памяти и не заботятся о переменных внутри объекта.

Из-за этой реализации по умолчанию equals :

Поэтому вам необходимо переопределить метод equals в вашем классе City , чтобы вы могли проверить, равны ли 2 объекта City. ответ Арвинда Кумара Авинаша предоставляет способ сделать это.

Однако каждая коллекция может реализовывать contains и подобные методы по-разному. HashSet могут использовать хеш-код объектов для их сравнения. Поэтому важно также переопределить метод hashCode для вашего класса.

Чтобы contains() работал правильно, вы должны переопределить методы equals() и hashCode() в вашем классе. Если вы этого не сделаете, основание для равенства состоит в том, что упоминаемые объекты — это одно и то же.

РЕДАКТИРОВАТЬ: Чтобы переопределить метод equals() , см. Ответ Арвинда Кумара Авинаша.

Источник

Метод Java ArrayList: contains() возвращает false, когда arraylist содержит данный объект

У меня проблема с методом contains() , который возвращает false, даже если ArrayList содержит заданный Object .
Мой код выглядит следующим образом:

Я пробовал Thread.sleep() между итерациями, поэтому ArrayList не был загружен с нетерпением без успеха.

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

Получит true , как ожидалось

Посмотрите на getPendingTransaction и getSentTransactionRequests, если он должен вернуть массив SAME и не создать NEW. Во-вторых, попробуйте отлаживать и искать идентификатор объекта массивов. Если это не то же самое, но оно должно быть (и содержит те же элементы), попробуйте обход этого (например, создать компаратор или список или что-то вроде этого).

Проблема заключается в том, что equals для массивов определяется как ссылочное равенство. Другими словами, два разных массива, которые содержат одни и те же элементы, НЕ равны… согласно методу equals .

Если вы хотите, чтобы equals для объектов транзакции был основан на равенстве строк, вам необходимо создать собственный класс для хранения String[] и переопределить метод equals и hashcode .

Кстати, метод array equals(Object) не “бит сломан”. Определенная семантика equals просто отражает тот факт, что любой объект массива по своей сути изменен.

Это потому, что String [] transaction является объектом. А когда вы вызываете contains , список сравнивает новый объект с другим, используя метод equals . Представьте себе, как делать

Если вы должны использовать List , возможно, вам не повезло с использованием equals() или hashCode() , похоже…

Возможно, вам лучше создать метод для сравнения ваших объектов.

Для тестирования contains() вам понадобится другой цикл…

Хотя вам следует серьезно использовать List
> .

Источник

Ошибки ArrayList, странное поведение contains

Странное поведение contains , после долгой отладки я заметил то что он практически не работает, всегда возвращает false Вот код:

Дальше идут простые функции

Шлю я аргументы простые,

3 ответа 3

Вот тут вы не верно используете contains, он проверяет на вхождение объект, т.е. ищет в коллекции элемент (integer) а у вас там ArrayList’ы лежат

правильно или нет я не знаю точно, но работает

Это было очень давно, вопрос старый, не рекомендую это использовать слишком медленно. ArrayList при использовании функции get выдаст исключение если вы вышли за пределы массива.

Вам надо переписать функцию следующим образом

Всё ещё ищете ответ? Посмотрите другие вопросы с метками java android или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.18.40487

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Оцените статью