Java Vector 在返回前被删除

标签 java generics vector

我解决了,但我不知道我的解决方案是不是最好的。所以欢迎任何有用的信息

我正在尝试创建一个给定 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/

相关文章:

java - 什么是持久化对象?

java - 如何在 JAVA (Netbeans) 中设置 JSpinner 的日期和时间?

java - 导入中缺少 Guice 多重绑定(bind)包

java - 为什么 toArray 的 <T> 隐藏了 Collection<E> 的 <E>?

c++ - vector -首先出现k值

c++ - 从指针 vector 中删除元素并释放之前通过新运算符分配的动态内存?

java - 我应该在哪里放置安装程序资源(wxs 文件、dmg 脚本、图标)以及在部署自包含应用程序时如何配置 maven antrun

java - 泛型数组转换

c# - 如何声明一个继承自另一个抽象类的抽象泛型类?

c++ - 新分配的 std::vector<int> 元素是否初始化为 0?