Java ArrayList问题

时间:2011-05-16 15:44:28

标签: java arraylist

我有一个名为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.

8 个答案:

答案 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)

你需要确保这里发生了两件事。

  1. 正确编写对象equalshashcode函数。
  2. 使用。indexOf()代替
  3. 如果您发布更多代码,我相信我们可以提供更多帮助。

答案 6 :(得分:0)

您是否在要添加到列表中的班级中实施了equals()hashcode()

答案 7 :(得分:0)

听起来像是标准的深/浅拷贝问题,而且你正在比较什么 - ArrayList中对象的地址或值。确定并遵循其他人关于equals和hashCode覆盖的建议

相关问题