我写了一种将对象添加到对象数组的方法。如果阵列已满,则应使用Arrays.copyOf创建一个新的阵列并将旧的阵列大小加倍。但是,它成功地增加了阵列的大小,但是它用旧阵列中最后一个对象的副本填充了新插槽。
这是ClassRoster类的add方法:
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];
}
main方法使用此方法从输入文本文件添加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后才复制旧数组的最后一个对象。在Holly之后,它不会打印出其余的学生。
解决方案
找出问题所在。阵列从未增加或增加过一倍。该数组的大小仍为10,因为它从未在add方法中重新进入while循环,因为while(i != classSize)
现在为false。因此,代码永远不会到达方法的if (i>=roster.length)
部分,并且不会增加数组的大小。该程序一直打印Holly的副本,因为scan.hasNext()
是真实的。它一直将数组中的最后一个对象返回到
System.out.printf(firstRoster.toString());
。它只是打印到控制台,而实际上没有分配给数组中的索引。
对于该解决方案,我只是在add方法中修改了while语句:
while(i != classSize || i >= roster.length)
答案 0 :(得分:1)
如果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++;
}
}
答案 1 :(得分:0)
解决方案
找出问题所在。阵列从未增加或增加过一倍。该数组的大小仍为10,因为它从未在add方法中重新进入while循环,因为while(i != classSize)
现在为false。因此,代码永远不会到达方法的if (i>=roster.length)
部分,并且不会增加数组的大小。该程序一直打印Holly的副本,因为scan.hasNext()
是真实的。它一直将数组中的最后一个对象返回到System.out.printf(firstRoster.toString());
。它只是打印到控制台,而实际上没有分配给数组中的索引。
对于该解决方案,我只是在add方法中修改了while语句:
while(i != classSize || i >= roster.length)