#java #eclipse #vector
#java #eclipse #вектор
Вопрос:
Я создавал программу для чтения и преобразования текстовых файлов в 2D вектор пользовательских объектов в eclipse, но кажется, что всякий раз, когда я вызываю Vector.clear() для 1D вектора, он также удаляет соответствующий элемент в 2D векторе. Почему это происходит и как мне это исправить? Кроме того, пожалуйста, имейте в виду, что я новичок в Java.
public Vector<Vector<gridObject>> copyToVector(Scanner s){
//main instantiation
Scanner lineReader = null;
gridObject objectInstance = new gridObject();
objectInstance.w = 10;
objectInstance.h = 10;
Vector<gridObject> objectVector = new Vector<gridObject>();
Vector<Vector<gridObject>> objectMatrix = new Vector<Vector<gridObject>>();
int rowNumber = 0;
int columnNumber = 0;
//reads next line break
while(s.hasNextLine()){
lineReader = new Scanner(s.nextLine());
rowNumber ;
//reads next character
while(lineReader.hasNext()){
columnNumber ;
//decides what object the character represents
switch(lineReader.next()){
case "0":
objectInstance.x = 10*(columnNumber-1);
objectInstance.y = 10*(rowNumber - 1);
objectInstance.id = 0;
break;
case "1":
objectInstance.x = 10*(columnNumber-1);
objectInstance.y = 10*(rowNumber - 1);
objectInstance.id = 1;
break;
default:
objectInstance.x = 10*(columnNumber-1);
objectInstance.y = 10*(rowNumber - 1);
objectInstance.id = -1;
break;
}
objectVector.addElement(objectInstance);
}
objectMatrix.addElement(objectVector);
System.out.println(objectMatrix.elementAt(0).size());
objectVector.clear();
System.out.println(objectMatrix.elementAt(0).size());
columnNumber = 0;
}
lineReader.close();
return objectMatrix;
}
Файл, который считывает эта функция, представляет собой простой текстовый файл, состоящий из нулей
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
И результат таков:
10
0
10
0
10
0
Почему это происходит?
Комментарии:
1. «всякий раз, когда я вызываю Vector.clear() для 1D-вектора, он также удаляет соответствующий элемент в 2D-векторе», основываясь только на этом, я держу пари, что это потому, что вы сохраняете ссылку на 1D-вектор вокруг
Ответ №1:
Заменить
objectVector.clear()
с
objectVector = new Vector<gridObject>();
Поскольку вы уже добавляете objectVector в objectMatrix, вызов clear в том же экземпляре также очистит внутри matrix. Для ввода новых значений требуется новая ссылка.
Также сразу после следующей строки
objectVector.addElement(objectInstance);
Добавьте новую строку
objectInstance = new gridObject();
ObjectInstance должен отличаться для значений каждый раз в программе, иначе он указывает на одну и ту же ссылку.
Предложение: 1. Замените Vector<> на List<>, который лучше по производительности. 2. В Java имя класса начинается с первой буквы в верхнем регистре. Пожалуйста, измените gridObject на GridObject.
С уважением
Комментарии:
1. Это решило мою проблему. Кроме того, спасибо за совет.
Ответ №2:
Проблема здесь:
objectMatrix.addElement(objectVector);
System.out.println(objectMatrix.elementAt(0).size());
objectVector.clear();
Имейте в виду, что objectVector
это ссылка. Итак, когда вы вызываете objectMatrix.addElement(objectVector);
, вы сохраняете ссылку на objectVector
into objectMatrix
. Фактический объект, на который указывает эта ссылка, не был скопирован или изменен каким-либо образом.
Таким образом, при вызове objectVector.clear()
вы очищаете объект, на который objectVector
указывает, который также является объектом, ссылку на который вы недавно добавили objectMatrix
.
Чтобы решить эту проблему, либо выделите a new Vector()
для каждой итерации вашего while
цикла, либо скопируйте содержимое objectVector()
в new Vector()
перед добавлением его в objectMatrix
.
Кстати, вам, вероятно, следует использовать ArrayList
вместо Vector
. Vector
это устаревший класс, который в наши дни почти никогда не требуется использовать.
Ответ №3:
Вы добавляете objectVector в objectMatrix — отлично. Затем вы очищаете objectVector, поэтому копия objectMatrix, имеющаяся в этом, теперь также очищена — не в порядке.
Почему бы вам не создать экземпляр objectVector в первом цикле while. например, вот так:
lineReader = new Scanner(s.nextLine());
Vector<gridObject> objectVector = new Vector<gridObject>();
Тогда вам не нужно это очищать.