我解决了,但我不知道我的解决方案是不是最好的。所以欢迎任何有用的信息
我正在尝试创建一个给定 vector 的方法,例如:[a, b, c, e] 应该返回 vector [[a,b],[a,c],[a,e]]。我将它用于 BFS。
public Vector<Vector<E>> routesFrom(Vector<E> edges) {
E source = edges.firstElement();
Vector<Vector<E>> returner = new Vector<>();
Vector<E> insert = new Vector<>();
for (int i=1; i<edges.size(); i++) {
insert.add(edges.firstElement());
insert.add(edges.elementAt(i));
returner.add(insert);
insert.removeAllElements();
}
return returner;
}
这是我的代码,但它在两个地方出现故障,首先,当我将“插入”添加到“返回器”而不是在旧值旁边添加新值时,它会删除所有值: 而不是 [[a,b],[a,c]] 我得到 [[a,c],[a,c]]。 最后,在返回之前,它全部被删除,最终返回为 [[],[],[]]。
感谢任何帮助,谢谢。
我的解决方案
public Vector<Vector<E>> routesFrom(Vector<E> edges) {
E source = edges.firstElement();
Vector<Vector<E>> returner = new Vector<>();
Vector<E> insert = new Vector<>();
for (int i=1; i<edges.size(); i++) {
insert.add(edges.firstElement());
insert.add(edges.elementAt(i));
returner.add(castObj(insert.clone()));
insert.removeAllElements();
}
return returner;
}
private Vector<E> castObj(Object object) {
Vector<E> returner = new Vector<>();
for (Object o : (Vector) object)
returner.add((E)o);
return returner;
}
最佳答案
insert.removeAllElements();
在 Java 中,对象通过引用传递。由于这是您传递给 returner
Vector 的同一个对象,因此当您删除它的元素时,returner
Vector 也会丢失这些元素。
修复:在循环内创建一个新的 Vector。
Vector<Vector<E>> returner = new Vector<>();
for (int i=1; i<edges.size(); i++) {
Vector<E> insert = new Vector<>();
insert.add(edges.firstElement());
insert.add(edges.elementAt(i));
returner.add(insert);
}
您的新答案看起来不错,但我有几个建议。 clone()
通常不是一个好用的方法,通常最好创建一个新集合,将旧集合传递给它的构造函数。
所以你可以替换:
returner.add(castObj(insert.clone()));
与:
returner.add(new Vector<E>(insert);
这也省去了您转换对象的麻烦。
关于Java Vector 在返回前被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937066/