Я написал метод, который добавляет объект в массив объектов.Если массив заполняется, он должен создать новый массив и удвоить старый размер массива, используя 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)