Я решил это, но я не знаю, лучшее ли решение. Поэтому любая полезная информация приветствуется
Я пытаюсь создать метод, который задает вектор, например: [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;
}
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);
Это также избавляет вас от проблемы с литьем объекта.