我解决了它,但我不知道我的解决方案是否是最好的。欢迎任何有用的信息
我试图制作一个给出矢量的方法,例如:[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;
}
这是我的代码,但它在2个地方出现故障,首先是我添加&#34;插入&#34;进入&#34;返回者&#34;它不会在旧值旁边添加新值,而是删除所有值: 取代[[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;
}
答案 0 :(得分:3)
insert.removeAllElements();
在Java中,对象通过引用传递。由于这是您传递到returner
向量的同一对象,因此当您删除其元素时,returner
向量也会丢失这些元素。
修复:在循环内创建一个新的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);
这也为您节省了转换对象的麻烦。