ArrayList indexOf () возвраты неправильно индексирует?

У меня есть проблема с 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 () возвращает правильный объект!

Благодаря всем участникам!

9
задан Morten Priess 24 June 2010 в 10:55
поделиться

4 ответа

Скорее всего, в вашем 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

7
ответ дан 3 November 2019 в 04:40
поделиться

Из API:

int indexOf(Object o):

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

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

1
ответ дан 3 November 2019 в 04:40
поделиться

У такого поведения может быть много причин:

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

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

3) Если вы ДЕЙСТВИТЕЛЬНО переопределили равное, проверьте свою реализацию. Он должен возвращать true для сравнения с той же ссылкой, а в вашем случае это не так.

0
ответ дан 3 November 2019 в 04:40
поделиться

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

List<Playlist> mPlaylists = new List<Playlist>();

p = new Playlist(<some parameters>);
mPlaylists.Add(p);
-1
ответ дан 3 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: