如何阅读成绩并删除低于平均水平的成绩

时间:2018-08-14 14:54:22

标签: java arraylist double

我遇到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);

2 个答案:

答案 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();
  }
}