1

我想检索列表中特定元素的索引:

    ArrayList<Field> list = new ArrayList<Field>();
    list.addAll(profile.getFieldsList());

    Object privacyName = "privacy";
    int i = list.indexOf(privacyName);
    boolean doesContain = list.contains(privacyName);

列表中有一个包含“privacy”的字段,但 i 始终为 -1,并且 dosContain 始终为 false。为什么这个搜索不起作用?

4

4 回答 4

3

为什么这个搜索不起作用?

因为list包含Field类的实例,并且您正在调用contains传递String实例的方法。

要使其工作,您需要传递Field该类的一个实例。

于 2013-08-07T13:45:14.713 回答
1

来自 Java 文档indexOf

返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1。

所以你的列表不包含对象privacyName

于 2013-08-07T13:45:46.427 回答
1
    public int indexOf(Object o) {
         if (o == null) {
             for (int i = 0; i < size; i++)
                 if (elementData[i]==null)
                     return i;
         } else {
             for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
   }

您需要覆盖 equals 以实现逻辑相等或依赖默认值来实现引用相等。

在这种情况下privacyName.equals(elementData[i])总是错误的。

于 2013-08-07T13:47:11.180 回答
1

在 ArrayList 方法的索引将基于 equals 方法。在字段类中覆盖 Object 类的 equals 和 hasCode 方法。你告诉过“列表中有一个包含“隐私”的字段”。IndexOf Array 将基于 equals 方法。正如@rocketboy 的回答,你需要正确地覆盖 equals 和 hasCode 方法。 为什么我需要覆盖 Java 中的 equals 和 hashCode 方法?

于 2013-08-07T14:26:26.997 回答