У меня есть проблема с ArrayList. Я использую ArrayList как это:
private ArrayList<Playlist> mPlaylists;
где Плей-лист является классом, наследованным от другого ArrayList. Я делаю следующее:
p = new Playlist(...some parameters...);
mPlaylists.add(p);
Позже, когда я использую 'p' для получения индекса в списке:
int index = mPlaylists.indexOf(p);
индекс '1' возвращается, даже при том, что контроль списка ясно показывает, что это - индекс '4'.
Кто-либо знает, почему это перестало работать?Спасибо.
B.R. Morten
Править: Та же проблема без indexOf (), использование равняется ():
private int GetIndex(Playlist playlist) {
for (int i = 0; i < mPlaylists.size(); i++) {
if (mPlaylists.get(i).equals(playlist)) {
return i;
}
}
return -1;
}
Новое редактирование: Это РАБОТАЕТ!:
private int getIndex(Playlist playlist) {
for (int i = 0; i < mPlaylists.size(); i++) {
if (mPlaylists.get(i) == playlist) {
return i;
}
}
return -1;
}
Решение: Как предложено, я изменил класс Плей-листа, чтобы не наследоваться ArrayList, а скорее хранению экземпляра конфиденциально. Оказалось, что я только должен был реализовать 4 метода ArrayList.
Это добивается цели; Теперь indexOf () возвращает правильный объект!
Благодаря всем участникам!
Скорее всего, в вашем PlayList
испортилась реализация equals
по умолчанию ArrayList, потому что способ 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 или случайно вставляете другой элемент в список, когда вы думаете, что он находится в конце.
EDIT
В соответствии с вашей правкой... видите? Ваш метод .equals()
сломан.
Рассмотрите его и убедитесь, что он соответствует описанию, определенному в Object.equals
Из API:
int indexOf(Object o)
:Возвращает индекс первого вхождения указанного элемента в этом списке, или
-1
, если этот список не содержит элемента. Более формально, возвращается наименьший индекс i такой, что(o==null ? get(i)==null : o.equals(get(i)))
, или-1
, если такого индекса нет.
Итак, ответ заключается в том, что вам нужно переопределить .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);