在arraylist中找到自定义对象的索引(android)

时间:2017-09-21 17:07:20

标签: android object arraylist indexof

我创建了一个模型

 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()方法的当前方法是什么?

3 个答案:

答案 0 :(得分:1)

列表中不存在p对象。在列表上运行indexOf将尝试根据引用查找对象。因此,如果参考不存在,您将找不到该对象。

为什么要避免for循环? indexOffor循环都是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