【问题标题】:How to return index of ArrayList<Field>如何返回 ArrayList<Field> 的索引
【发布时间】:2013-08-07 13:43:29
【问题描述】:

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

    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。为什么这个搜索不起作用?

【问题讨论】:

  • 您的列表包含Field 类型的元素,其值不能为"privacy"。您是否拥有 Field 的某些属性,您对此具有该价值?
  • 我认为这是您使用的对象而不是归档的原因?

标签: java arrays search


【解决方案1】:

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

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

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

【讨论】:

  • 那么我该如何为'Field'类型做到这一点?
  • 问题是他传递了一个不可能是FieldString 实例。
【解决方案2】:
    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]) 始终为 false。

【讨论】:

    【解决方案3】:

    From the Java docs for indexOf:

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

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

    【讨论】:

      【解决方案4】:

      在 ArrayList 方法的索引将基于 equals 方法。在字段类中覆盖 Object 类的 equals 和 hasCode 方法。你告诉过“列表中有一个包含“隐私”的字段”。 IndexOf Array 将基于 equals 方法。正如@rocketboy 的回答,你需要正确地覆盖 equals 和 hasCode 方法。 Why do I need to override the equals and hashCode methods in Java?

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        • 2015-07-01
        • 1970-01-01
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多