Вектор Java стирается перед возвращением

1

Я решил это, но я не знаю, лучшее ли решение. Поэтому любая полезная информация приветствуется

Я пытаюсь создать метод, который задает вектор, например: [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-х местах, сначала, когда я добавляю "вставить" в "возвращенное" вместо добавления нового значения рядом со старым значением, он удаляет все значения: вместо [[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;
}
Теги:
generics
vector

1 ответ

3
Лучший ответ
insert.removeAllElements();

В Java объекты передаются по ссылке. Так как это тот же самый объект, который вы передаете в returner Вектор, когда вы удаляете его элементы, returner Вектор также теряет эти элементы.

Исправить: создать новый вектор внутри цикла.

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

Это также избавляет вас от проблемы с литьем объекта.

  • 0
    Спасибо за помощь. Я просто нашел решение и разместил его в оригинальном сообщении. Он использует clone () всякий раз, когда я вставляю. Не могли бы вы проверить это и сказать мне, все ли в порядке или это доставит мне проблемы?
  • 1
    Очень хорошо. Я чувствовал, что это может быть проблематично. Еще раз спасибо за помощь мистер Нуб :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню