覆盖LinkedList中的indexOf以检查身份,而不是相等

时间:2013-08-02 11:06:54

标签: java list indexof

我有一个List(实际上是LinkedList)并且我向其添加了实现equals方法的项目。

问题是我添加了相同但不相同的项(比如两个初始化对象)。现在,当我想获得第二个项目的索引时,我当然得到第一个项目的元素,因为indexOf搜索相等而不是标识。

我尝试创建自己的LinkedList子类并覆盖indexOf - 方法,但这是不可能的,因为我无法访问子类{{1} }也不是节点元素Node

以下是一个例子:

first

我的意图:我需要一个对象列表,我想在那里存储已初始化的对象并在以后编辑它们。

2 个答案:

答案 0 :(得分:5)

自己进行迭代,indexOf只是一个辅助方法:

static int indexOfById(List<?> list, Object searchedObject) {
  int i = 0;
  for (Object o : list) {
    if (o == searchedObject) return i;
    i++;
  }
  return -1;
}

答案 1 :(得分:1)

这个问题有几种解决方法。

1)正确的解决方案:如果您需要进行身份比较,则不应覆盖equals方法。你告诉我们你必须覆盖它,因为你需要在另一个地方。这表明您的软件存在设计问题,您真的应该解决这个问题。

2)看看班级sun.awt.util.IdentityLinkedList。这几乎是“正常”LinkedList,具有indexOf方法的标识行为。如果您不想依赖sun子包中的类,可以将代码复制到包含在类中的类中。

3)您可以按照程序解决方案自行迭代列表:

public static <E> int indexOf(List<E> list, E searchItem) {
    int index = 0;
    for (E item : list) {
        if (item == searchItem)
            return index;
        index += 1;
    }
    return -1;
}

4)为你的对象写一个包装器。

public class IdentityWrapper {
    public Object item;
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        IdentityWrapper other = (IdentityWrapper) obj;
        return item == other.item;
    }
}

然后在列表中使用此包装器:LinkedList<IdentityWrapper>。请注意,我在包装器中提供了一个公共项目字段。通常情况下,我只使用构造函数和私有字段来执行此操作。