我遇到ArrayList
的问题。我编写了一个简单的程序,该程序可以获取成绩并删除低于平均水平的成绩!但是,它无法正常工作,我无法弄清楚问题出在哪里。我真的很感谢您的帮助。这是我的代码
Scanner input = new Scanner(System.in);
ArrayList<Double> grades = new ArrayList<Double>();
boolean stop = false;
int i=0;
while(!stop){
i++;
System.out.println("Enter the names number "+i+":");
grades.add(input.nextDouble());
if(i%5==0){
System.out.println("\nDo you want to continue ?Enter \"Yes\" or \"No\"");
stop = (input.next()).equals("No");
}
}
double sum=0.0;
double ave;
for(int j=0;j<grades.size();j++){
sum+=grades.get(j);
}
ave = sum/i;
System.out.println("The average of "+(i)+" students is "+ave);
System.out.println("The students grades are: "+grades);
for(int j=0;j<grades.size();j++){//I want to remove any below average grades !?
if((grades.get(j).doubleValue())<ave){
System.out.println("\n"+grades.get(j)+"\n");
grades.remove(j);
}
else;
}
System.out.println("\nThe grades that are above the average: "+grades);
答案 0 :(得分:0)
您从列表中删除,但继续增加索引“ j”。因此,每次删除元素时,都会跳过下一个元素。
一个简单的解决方案是向后迭代:
for(int j=grades.size() - 1;j >= 0; j--)
答案 1 :(得分:0)
您的问题似乎是,删除时您没有调整索引,即调用grades.remove(j);
时也需要添加j--
(尽管这并不理想,有关更多内容,请参见稍后)。
对您的问题进行更直观的说明(您也可以对其他问题执行类似的操作):
假设我们有一个列表[4, 5, 3, 1, 1, 3, 5, ...]
和平均值3
。
现在,您进行迭代,并在j = 0
处找到4。将其删除,您的列表将变为[5, 3, 1, 1, 3, 5, ...]
。
接下来,检查j = 1
并查看3
。您是否注意到我们跳过了5
?这是因为当您删除一个元素时,所有其他元素都向下移动了一个索引,即,索引1处的元素现在位于索引0处。要满足此要求,您还需要j--
或...
或者向后迭代:for( int j = grades.size() -1; j >= 0; j--)
。由于您的迭代和元素都朝同一方向移动,因此无需调整索引。
更好:使用迭代器。这样,您仍然可以从头到尾移动,并让迭代器处理后台的索引逻辑。
for( Iterator<Double> itr = grades.iterator(); itr.hasNext(); ) {
Double grade = itr.next();
//you might want to check for null
if( grade < ave ){
itr.remove();
}
}