我有一个List
(实际上是LinkedList
)并且我向其添加了实现equals
方法的项目。
问题是我添加了相同但不相同的项(比如两个初始化对象)。现在,当我想获得第二个项目的索引时,我当然得到第一个项目的元素,因为indexOf
搜索相等而不是标识。
我尝试创建自己的LinkedList
子类并覆盖indexOf
- 方法,但这是不可能的,因为我无法访问子类{{1} }也不是节点元素Node
。
以下是一个例子:
first
我的意图:我需要一个对象列表,我想在那里存储已初始化的对象并在以后编辑它们。
答案 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>
。请注意,我在包装器中提供了一个公共项目字段。通常情况下,我只使用构造函数和私有字段来执行此操作。