Intereting Posts
Устройство Android LogCat отключено Android Studio: проблемы с координаторомLayout Как заставить RelativeLayout работать с объединением и включать? Как не обфускать методы интерфейса и его параметры с помощью Progaurd в android? Как создать стандартные кнопки Borderless (как в упомянутом руководстве по проектированию)? ClipToBounds для детей Просмотров внутри LinearLayout android Настройка ListView для прокрутки позиции в Android Почему `hasEnrolledFingerprints` дает ошибку, что она требует разрешения только в моем фрагменте, но не в действии в примере Google? Как получить идентификатор рекламы в android Как обновить текст уведомления для службы переднего плана в Android? Соответствующее умножение матриц для вращения / перевода Почему эмулятор Android сообщает «неизвестное виртуальное устройство», когда устройство находится в моем каталоге пользователя? Выполнение не выполнено для задачи ': app: processDebugResources' даже с последними инструментами сборки Чтение штрих-кодов с помощью android Управление диапазоном диапазонов диапазонов Android Multipoint

ArrayList indexOf () возвращает неверный индекс?

У меня проблема с ArrayList. Я использую ArrayList следующим образом:

private ArrayList<Playlist> mPlaylists; 

Где Playlist – это класс, унаследованный от другого ArrayList. Я делаю следующее:

 p = new Playlist(...some parameters...); mPlaylists.add(p); 

Позже, когда я использую 'p', чтобы получить индекс в списке:

 int index = mPlaylists.indexOf(p); 

Возвращается индекс «1», хотя проверка списка ясно показывает, что это индекс «4».

Кто-нибудь знает, почему это не удается? Благодарю.

BR Morten

Изменить: та же проблема без indexOf (), используя equals ():

 private int GetIndex(Playlist playlist) { for (int i = 0; i < mPlaylists.size(); i++) { if (mPlaylists.get(i).equals(playlist)) { return i; } } return -1; } 

Новое редактирование: This WORKS !:

 private int getIndex(Playlist playlist) { for (int i = 0; i < mPlaylists.size(); i++) { if (mPlaylists.get(i) == playlist) { return i; } } return -1; } 

Решение. Как и было предложено, я изменил класс Playlist, чтобы не наследовать ArrayList, а скорее хранить экземпляр в частном порядке. Оказалось, что мне нужно было реализовать только 4 метода ArrayList.

Это делает трюк; Теперь indexOf () возвращает правильный объект!

Спасибо всем участникам!

Solutions Collecting From Web of "ArrayList indexOf () возвращает неверный индекс?"

Скорее всего, ваш PlayList испорчен по умолчанию ArrayList equals реализации, потому что метод indexOf вычисляется так:

 indexOf(Object o) if( o == null ) then iterate until null is found and return that index if( o != null ) iterate until o.equals( array[i] ) is found and return taht index else return -1 end 

Итак, вы делаете что-то смешное с вашим методом .equals, или вы случайно вставляете другой элемент в список, когда думаете, что он в конце.

РЕДАКТИРОВАТЬ

В соответствии с вашими изменениями … видите? Ваш .equals() нарушен.

Попробуйте сделать хороший обзор и убедитесь, что он придерживается описания, определенного в Object.equals

Из API :

int indexOf(Object o) :

Возвращает индекс первого вхождения указанного элемента в этот список или -1 если этот список не содержит элемент. Более формально возвращает наименьший индекс i такой, что (o==null ? get(i)==null : o.equals(get(i))) или -1 если такого индекса нет.

Поэтому ответ заключается в том, что вам необходимо переопределить .equals() в .equals() Playlist .

Это может быть много причин:

1) Если несколько элементов в ArrayList равны (по методу equals), то возвращается первый . Возможно, у вас просто несколько идентичных объектов.

2) Класс PlayList расширяет ArrayList (я не уверен, что это хорошая идея). Поэтому, если вы не переопределили метод equals, сравнение основывается только на последовательности элементов. Например, любые два пустых экземпляра PlayList будут считаться равными.

3) Если вы переопределили равные значения, проверьте свою реализацию. Он должен возвращать true для сравнения с той же ссылкой, и в вашем случае это не так.

Я не уверен, почему у вас возникла эта проблема, но я думаю, что если бы я был вами, я бы решил использовать новый общий список, чтобы создать свой список следующим образом:

 List<Playlist> mPlaylists = new List<Playlist>(); p = new Playlist(<some parameters>); mPlaylists.Add(p);