Vector.clear() в многомерных векторах

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

Тогда вам не нужно это очищать.