我有一个名为A的arrayList,比方说,它是非空的。
我创建另一个arrayList,B,并放入A的一些元素。
for(someobject obj : A){
if(some_condition_is_met)
B.add(obj);
}
然后我用B做一些事情(从不修改,改组或删除它的对象。我选择B的元素,说B.get(i)
。
现在,我想找到B.get(i)在A中的位置。
我试过
for(someobject obj : A){
if(obj.equals(B.get(i))
return A.lastIndexOf(obj);
}
return null;
但是这仍然是返回null。也就是说,“等于”与对象不匹配。
在我的挫折中,我试过了:
return A.get(A.lastIndexOf(B.get(i));
导致ArrayINdexOutOfBounds异常。
我应该做些什么?我有一种感觉,我错过了一些明显的东西。 还有一点 - 这是对我正在做的事情的非常简化的解释。在上面的示例中,创建B可能看起来毫无意义,但这是必要的。
对问题的回答:
1)对象是自定义对象。啊,......我没有覆盖等于。可能就是这样。
2)我可以确定A中B mst B中的任何对象,因为在创建B时,首先我从中删除所有对象,以防万一,然后我只添加A中的对象并且我不会篡改对象B.
答案 0 :(得分:2)
您从第二个代码块中获取i
的位置,是否按照B
的大小进行检查?即。
for(someobject obj : A){
if(obj.equals(B.get(i))
return A.lastIndexOf(obj);
}
return null;
当您i
并获得ArrayIndexOutOfBounds时,B
的大小是return A.get(A.lastIndexOf(B.get(i));
的大小是什么?
在填充A和B之后执行此简单测试,以检查它们是否具有预期值...
for (Object o : B)
{
System.out.println(A.lastIndexOf(o));
}
如果您在此阶段遇到问题,则可能在构建对象时遇到问题。还要确保你不会在任何地方吞下异常。
答案 1 :(得分:2)
你要做的事情的原则应该有效。我可以做出这样的狡辩,即在执行FOR循环以搜索A以从B中找到对象的实例,然后在其上执行lastIndexOf时没有什么意义。无论如何,lastIndexOf将遍历A.你正在寻找一些东西,然后当你找到它时,你只是将它留在它所在的位置并再次搜索它。 (不可否认,你的第一次搜索是从A开始的,而lastIndexOf将从最后搜索。所以这就像在地下室找到你的车钥匙并在阁楼上工作。然后当你找到它们时,你把它们留在那里,然后去阁楼,再次开始搜索,直到地下室。)
我怀疑这个问题不在概念中,而是在细节上。您可以显示实际代码。如果代码太复杂,请尝试将其简化为基本要素并查看错误是否仍然存在。
一种可能性:您是否真的直接将对象从A添加到B?或者您是否为B创建了一个新对象,它是A对象的副本?如果是后者,那么除非你重写equals()它不会起作用,因为用户定义对象的默认equals()只是检查它们是否是同一个实例,而不是“等价”对象。
答案 2 :(得分:1)
覆盖对象中的equals()和hashcode()方法
@Override
public boolean equals(Object o) {
boolean result = false;
if (o instanceof Someobject ) {
Someobject other = (Someobject ) o;
result = attribute.equalsIgnoreCase(other.attribute);
}
return result;
}
@Override
public int hashCode() {
return attribute.hashCode();
}
答案 3 :(得分:1)
似乎B包含来自A的不同对象。您确定,等于方法在您的对象中是否正确?你还没有修改B(或A)中的对象?
答案 4 :(得分:1)
some_condition_is_met
是否总是false
?如果是这样,这将完美地解释整个用例 - 除了B.get(i)
,无论IndexOutOfBoundsException
是什么,它总是返回i
。
因此,在运行第一个循环后,您可以尝试B.isEmpty()
检查吗?
答案 5 :(得分:0)
你需要确保这里发生了两件事。
equals
和hashcode
函数。 indexOf()
代替如果您发布更多代码,我相信我们可以提供更多帮助。
答案 6 :(得分:0)
您是否在要添加到列表中的班级中实施了equals()
和hashcode()
?
答案 7 :(得分:0)
听起来像是标准的深/浅拷贝问题,而且你正在比较什么 - ArrayList中对象的地址或值。确定并遵循其他人关于equals和hashCode覆盖的建议