ArrayList indexOf()返回错误的索引?

时间:2010-06-24 20:39:41

标签: java android arraylist

我有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()的相同问题,使用equals():

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()返回正确的对象!

感谢所有贡献者!

4 个答案:

答案 0 :(得分:7)

您的PlayList很可能搞砸了默认的ArrayList equals实现,因为indexOf calculated 的方式如下:

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

中定义的说明

答案 1 :(得分:1)

来自API

  

int indexOf(Object o)

     

返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。更正式地,返回最低索引i,如果没有这样的索引,则返回(o==null ? get(i)==null : o.equals(get(i)))-1

所以答案是你需要覆盖.equals()中的Playlist

答案 2 :(得分:0)

这种行为可能有很多原因:

1)如果ArrayList中的多个元素相等(根据equals方法),则返回 first 。也许你只是拥有多个相同的对象。

2)你的PlayList类扩展了ArrayList(我不确定这是个好主意)。因此,如果未覆盖equals方法,则比较仅基于元素序列。例如,任何两个空的PlayList实例都将被视为相等。

3)如果DID覆盖等于,请检查您的实施。它必须返回true才能与同一个引用进行比较,在你的情况下它不会。

答案 3 :(得分:-1)

我不确定你为什么遇到这个问题,但我想如果我是你,我会选择使用较新的通用列表来创建你的列表:

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

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