我创建了一个模型
public class Portfolio {
private String id;
private String name;
public Portfolio() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我有这个型号的清单。我想找到一个特定项目的位置。
我试过了
Portfolio p = new Portfolio();
p.setId("1");
p.setName("Test");
int i = PortfolioList.indexOf(p);
当我记录" i "的值时它返回" -1 "。但我确定" p "对象在arraylist中可用 我不想使用 for()循环。我认为如果我们的arraylist中有太多的对象,找到一个对象需要时间。
使用 indexOf()方法的当前方法是什么?
答案 0 :(得分:1)
列表中不存在p
对象。在列表上运行indexOf
将尝试根据引用查找对象。因此,如果参考不存在,您将找不到该对象。
为什么要避免for
循环? indexOf
和for
循环都是O(n)。
只需编写for
循环即可根据id
比较列表中的每个值。这是最好的方式。
答案 1 :(得分:1)
问题是您的类Portfolio
没有覆盖java.lang.Object中的equals()
方法。因此,当indexOf()
正在搜索元素时,它将仅使用来自Object的equals()
的实现,它只是检查两个对象是否实际上是同一个实例。您可以在以下资源中查看更多相关信息:
https://javaranch.com/journal/2002/10/equalhash.html
鉴于您刚刚在代码段中创建了对象p
,它将不会与存储在ArrayList中的实例相同,因此它将始终返回未找到。
解决此问题的方法是在equals()
课程中创建自己的Portfolio
实施。但是,你自己没有必要做那件乏味的工作。相反,我强烈建议您使用AutoValue注释:
https://github.com/google/auto/blob/master/value/userguide/index.md
AutoValue实际上会减少您当前的Portfolio
课程,并为您免费提供equals()
和hashCode()
。看看上面的链接,这可以帮到你。
答案 2 :(得分:1)
在这种情况下,你试图避免for循环吧?所以你可以更好地使用hashmap ..
请参阅此处:https://developer.android.com/reference/java/util/HashMap.html