Динамическое увеличение длины массива при добавлении объектов в массив - PullRequest
0 голосов
/ 25 февраля 2019

Я написал метод, который добавляет объект в массив объектов.Если массив заполняется, он должен создать новый массив и удвоить старый размер массива, используя Arrays.copyOf.Однако это приводит к успешному увеличению размера массива, но заполняет новые слоты дубликатами последнего объекта из старого массива.

Вот метод добавления из класса ClassRoster:

void add(Student newStudent){
    int i=0;
    while(i != classSize){
        if(roster[i] == null{
            roster[i] = newStudent;
            break;
        }
        if(i>=roster.legnth){
            Student[] newRoster = Arrays.copyOf(roster, 2*roster.length);
            roster = newRoster;
        }
        i++;
    }
}

Класс ClassRoster также имеет конструктор, инициализированный с размером массива 10.

public class ClassRoster{
    private Student[] roster;
    final int SIZE = 10;


    public ClassRoster(){
       this.roster = new Student[SIZE];
    }

Основной метод использует этот метод для добавления объектов Student из входного текстового файла:

ClassRoster firstRoster = new ClassRoster();
scan = new Scanner(inputFile).useDelimiter(",|\\n");
while(scan.hasNext()){
    String name = scan.next();
    int gradeLevel = scan.nextInt();
    int testGrade = scan.nextInt();
    Student newStudent = new Student(name,gradeLevel,testGrade);
    firstRoster.add(newStudent);
    System.out.printf(firstRoster.toString());
}

Текстовый файл будет выглядеть так:

John,12,95
Mary,11,99
Bob,9,87
Larry,10,90
Steph,11,89
James,12,95
Susan,11,88
Harry,9,78
Ann,10,92
Holly,9,86
Sammy,12,75
Jen,11,90
Katrina,9,94

Тем не менее, программа выдает следующий результат:

John,12,95
Mary,11,99
Bob,9,87
Larry,10,90
Steph,11,89
James,12,95
Susan,11,88
Harry,9,78
Ann,10,92
Holly,9,86
Holly,9,86
Holly,9,86
Holly,9,86

Кажется, что он просто копирует последний объектстарого массива после того, как он достигнет максимального размера 10. После Холли он не распечатывает остальных учеников.

РЕШЕНИЕ

Выяснил проблему.Массив никогда не удваивался и не увеличивался в размере.Массив по-прежнему имеет размер 10, поскольку он никогда не переходит в цикл while в методе add, поскольку while(i != classSize) теперь равно false.Следовательно, код никогда не достигает части метода if (i>=roster.length) и не увеличивает размер массива.Программа продолжала печатать дубликаты Холли, потому что scan.hasNext() было правдой.Он возвращал последний объект в массиве в System.out.printf(firstRoster.toString());.Он просто печатал на консоль, но на самом деле не был привязан к индексу в массиве.

Для решения я просто изменил инструкцию while в методе add:

while(i != classSize || i >= roster.length)

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

РЕШЕНИЕ

Разобрался с проблемой.Массив никогда не удваивался и не увеличивался в размере.Массив по-прежнему имеет размер 10, потому что он никогда не переходит в цикл while в методе add, поскольку while(i != classSize) теперь равно false.Поэтому код никогда не достигает части метода if (i>=roster.length) и не увеличивает размер массива.Программа продолжала печатать дубликаты Холли, потому что scan.hasNext() было правдой.Он возвращал последний объект в массиве в System.out.printf(firstRoster.toString());.Он просто печатал на консоль, но на самом деле не был привязан к индексу в массиве.

Для решения я просто изменил оператор while в методе add:

while(i != classSize || i >= roster.length)

0 голосов
/ 25 февраля 2019

Если classSize совпадает с roster.length, то вы должны изменить его значение, когда вы удваиваете размер массива (хотя вы не должны хранить отдельную переменную, поскольку у вас есть roster.length, если вам это не нужно для чего-то другого).Когда вы удваиваете размер массива, вы можете добавить новый элемент в позицию classSize (classSize по-прежнему равен предыдущему размеру) и разорвать цикл:

void add(Student newStudent){
    int i=0;
    while(i != classSize){
        if(roster[i] == null{
            roster[i] = newStudent;
            break;
        }
        if(i >= roster.legnth){
            Student[] newRoster = Arrays.copyOf(roster, 2 * roster.length);
            roster = newRoster;
            roster[classSize] = newStudent;
            classSize = roster.length;
            break;
        }
        i++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...