Java Vector在返回之前被删除

时间:2014-05-29 15:33:23

标签: java generics 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;
}

这是我的代码,但它在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;
}

1 个答案:

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

这也为您节省了转换对象的麻烦。