我有一个带有以下代码的ArrayIndexOutofBounds异常。
在 Node nodeJ = vect.get(j)
但它对我没有意义,因为j肯定小于i而 Node nodeI = vect.get(i)
不会抛出任何异常。
感谢任何帮助。
public static Vector join(Vector vect) throws ItemNotFoundException {
Vector<Node> remain = vect;
for (int i = 1; i < vect.size(); i++) {
Node nodeI = vect.get(i);
for (int j = 0; j < i; j++) {//traverse the nodes before nodeI
Node nodeJ = vect.get(j);
if (nodeI.getChild1().getSeq().equals(nodeJ.getSeq())) {
nodeI.removeChild(nodeJ);
nodeI.setChild(nodeJ);
remain.remove(j);
}
if (nodeI.getChild2().getSeq().equals(nodeJ.getSeq())) {
nodeI.removeChild(nodeJ);
nodeI.setChild(nodeJ);
remain.remove(j);
}
}
}
return remain;
}
Vector<Node> remain = vect;
for (int i = 1; i < vect.size(); i++) {
Node nodeI = vect.get(i);
for (int j = 0; j < i; j++) {//traverse the nodes before nodeI
Node nodeJ = vect.get(j);
if (nodeI.getChild1().getSeq().equals(nodeJ.getSeq())) {
nodeI.removeChild(nodeJ);
nodeI.setChild(nodeJ);
remain.remove(j);
}
if (nodeI.getChild2().getSeq().equals(nodeJ.getSeq())) {
nodeI.removeChild(nodeJ);
nodeI.setChild(nodeJ);
remain.remove(j);
}
}
}
return remain;
}
答案 0 :(得分:6)
您正在通过别名引用remain
从正在迭代的同一向量中删除元素。如果你想使用副本,你应该有
Vector<Node> remain = new Vector<Node>(vect);
答案 1 :(得分:4)
如果在内部循环中从向量中删除了多个i - j
节点,会发生什么?您最终会得到j > vect.size()
。
可能最好将第二个for循环中的条件更改为j < i && j < vect.size()
,但是我认为算法存在一些缺陷,它涉及对一个集合进行双重迭代以在迭代时从中删除元素
答案 2 :(得分:1)
当您在迭代它时,您正在从vect
删除内容。你确定那是你想做的吗?
请记住这一行:
Vector<Node> remain = vect;
不创建vect
的副本。从remain
删除某些内容,它也将从vect
中删除,因为这两个名称指的是同一个实际对象。
答案 3 :(得分:1)
你应该使用Iterator。查看文档http://java.sun.com/docs/books/tutorial/collections/interfaces/collection.html
您可以阅读:
请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定。
答案 4 :(得分:0)
您正在从矢量中删除项目。
使用一些日志记录在内循环的每次迭代中输出向量的内容,你会看到发生了什么。
答案 5 :(得分:0)
从向量中移除项目(您执行此操作)时,向量的长度会发生变化。问题是删除后的代码删除了很多节点,现在使用的索引不再有效。