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

Java ArrayList indexOf()返回了错误的索引?,java,android,arraylist,Java,Android,Arraylist,我对ArrayList有问题。我使用的ArrayList如下所示: private ArrayList<Playlist> mPlaylists; List<Playlist> mPlaylists = new List<Playlist>(); p = new Playlist(<some parameters>); mPlaylists.Add(p); 稍后,当我使用“p”获取列表中的索引时: int index = mPlaylists

我对ArrayList有问题。我使用的ArrayList如下所示:

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

p = new Playlist(<some parameters>);
mPlaylists.Add(p);
稍后,当我使用“p”获取列表中的索引时:

int index = mPlaylists.indexOf(p);
返回索引“1”,即使对列表的检查清楚地表明它是索引“4”

有人知道为什么会失败吗? 谢谢

B.R。 莫顿

编辑: 不带indexOf()的相同问题,使用equals():

private int GetIndex(播放列表){
对于(int i=0;i
新编辑: 这管用!:

private int getIndex(Playlist playlist) {
    for (int i = 0; i < mPlaylists.size(); i++) {
        if (mPlaylists.get(i) == playlist) {
            return i;
        }
    }
    return -1;
}
private int getIndex(播放列表){
对于(int i=0;i
解决方案: 正如建议的那样,我将Playlist类从ArrayList更改为not enherit,而是将一个实例私有化。事实证明,我只需要实现4个ArrayList方法

这就是诀窍;现在indexOf()返回正确的对象


感谢所有的贡献者

我不知道您为什么会遇到这个问题,但我想如果我是您,我会选择使用较新的通用列表来创建您的列表,如下所示:

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

p = new Playlist(<some parameters>);
mPlaylists.Add(p);
List-mPlaylists=新列表();
p=新播放列表();
新增(p);

您的
播放列表很可能与默认的ArrayList
equals
实现混淆,因为
索引的方式类似于:

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()
方法已损坏

考虑进行良好的审查,并确保其符合下列文件中定义的说明:

int indexOf(对象o)

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


因此,答案是您需要覆盖播放列表中的
.equals()

中的
.equals()

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

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


3) 如果您确实重写了equals,请检查您的实现。与同一引用进行比较时,它必须返回true,而在您的情况下,它不会返回true。

在mPlaylists中有什么。获取(1)?你是否覆盖了播放列表中的
equals()
-有什么奇怪的地方吗?播放列表是否覆盖了ArrayList的索引?我最初的回答是“你拥有的p不是你认为你拥有的p”,然后是“一个p认为它是另一个p(或者不知道它本身是什么)”。哇,这是快速的响应!!谢谢大家!不,我没有覆盖equals()。然而,equals()似乎有些古怪。当我在循环中迭代时,搜索到项-使用equals()进行比较,它在索引1处找到了错误的对象!!通过检查,我可以看出前几个成员是相同的,但随后出现了一些差异。equals()可能会被这一点混淆吗?在EdgEnter中添加我的代码测试,考虑不要从<代码> AlrayList</C>中继承,而是在播放列表中用一个作为私有实例变量(创建<代码>列表>代码> >在您的<代码>播放列表中,并适当地将它们委托给私有<代码> ARARYLIST/<代码>。通过扩展,您可能得到了比您需要的更多。无法实例化列表。。但无法否决投票,今天的票数不足;-)OP使用的是泛型表单——不仅仅是列表接口,而是实现ArrayList。虽然不是完全干净的,但这通常被认为是类的私有成员。当您编写的代码无法编译时——您无法实例化列表——它是一个接口。将“ArrayList”放在作业的右侧,就可以了。@Lauri-别担心,我还有票数>:-)Russ-这甚至不会编译,也不会回答问题。根据你的新编辑,你正在进行引用比较,这让我觉得你根本没有继承ArrayList。看起来你对这个
播放列表
类做了一些非常奇怪的事情(比如使用大写的方法名yiack…)呵呵,是的-但是至少通过使用大写的方法名,我不会忘记这只是一个测试方法,为了跟踪这个问题:-)谢谢!我猜引用比较在这种情况下有效,因为它很简单。我仍然看不出我能对这个班做些什么来打乱equals()?jejej。。。相信我,你会的。。你会……:)使用下划线,比如
\u add()
\u getIndex()
,或者更好,对方法进行预先“测试”…@Morten:Me都不是,如果你真的继承了
ArrayList
而没有重写。等于就足够了,因为它已经不存在了。如果您有.equals方法,请尝试将其重命名为。myEquals。。。若要让默认(ArrayList)实现工作,并查看该帮助是否应该不工作,请检查他是否真的继承了
ArrayList
,因为该类已重写该方法。因此,建议不要再次覆盖它(或正确地执行它)嗯。。。所以我所做的;从ArrayList继承而不是覆盖