尝试查找数组平均值时数组大小不正确,如何解决?

时间:2018-07-12 20:05:02

标签: java arrays average

在我的程序中,我有主题,每个主题可以有许多作业。我正在尝试查找“ assignmentGradeAchieved”不为空的每个作业的平均成绩。

我在数组中存储了这些assignmentGradeAchieved。我想找到平均结果(将每个数字相加然后除以项目数),但是它没有显示正确的arraysize。当它应为2时显示为1。 这是我尝试查找arraysize的代码行:     arraySize =(assignmentGradesAchieved.size());

//对于属于该主题的每个作业,如果AssignmentGradeAchieved不为null,则将AssignmentGradeAchieved添加到名为AssignmentGradesAchieved的数组列表中。 //如果一个主题有多个具有AssignmentGradeAchieved的作业,则应将多个以上AssignmentGradeAchieved添加到名为AssignmentGradesAchieved的畜牧学家中。因此,数组的大小应大于一。 //我的一个主题有两个都具有AssignmentGradeAchieved的作业,因此数组大小应为2而不是1

    for(int i=0; i<subjects.size(); i++){ //for each subject in the list
        Subject subject = subjects.get(i);


        List<Assignment> assignments = subject.getAssignment(); //Get the list of assignments belonging to current subject

            for(int y=0; y<assignments.size(); y++ ) { //For each assignment in the list 
                Assignment assignment = assignments.get(y);

                ArrayList<Double> assignmentGradesAchieved = new ArrayList<Double>(); 
                if(assignments.get(y).getAssignmentGradeAchieved()!=null) {
                    assignmentGradesAchieved.add(assignments.get(y).getAssignmentGradeAchieved());
                    arraySize = 0;
                    arraySize = (assignmentGradesAchieved.size());  
                    for(int z=0; z<assignmentGradesAchieved.size(); z++) {
                        arraySize = 0;
                        allAssignments = allAssignments + assignmentGradesAchieved.get(z);

                        arraySize = (assignmentGradesAchieved.size());      
                        averageAssignGrade = (allAssignments / arraySize);

                    }
                }
    }


    }

解决方案:

   for(int i=0; i<subjects.size(); i++){ //for each subject in the list
        Subject subject = subjects.get(i);

        List<Assignment> assignments = subject.getAssignment(); //Get the list of assignments belonging to current subject
        ArrayList<Double> assignmentGradesAchieved = new ArrayList<Double>(); 

            for(int y=0; y<assignments.size(); y++ ) { //For each assignment in the list 
                Assignment assignment = assignments.get(y);
                allAssignments =0;

                if(assignments.get(y).getAssignmentGradeAchieved()!=null) {
                    assignmentGradesAchieved.add(assignments.get(y).getAssignmentGradeAchieved());

                for(int z=0; z<assignmentGradesAchieved.size(); z++) {

                    allAssignments = allAssignments + assignmentGradesAchieved.get(z);
                }
                }

    }
            arraySize = 0;
            arraySize = (assignmentGradesAchieved.size());  
            averageAssignGrade = (allAssignments / arraySize);


    }

2 个答案:

答案 0 :(得分:2)

您的AssignmentGradesAchieved声明位于for循环内,因此它将始终被重置,因此您的变量将始终仅具有一个赋值等级。将您的声明置于循环之外

答案 1 :(得分:1)

在代码中,每次找到一个AssignmentGradeAchieved时,您都在计算平均值,这是错误的。主要策略有两种:

  • 保存收集的数字,然后计算平均值
  • 分别保存完成的AssignmentGrade的总和和AssignmentGrade的数目。然后除以得到平均值。

对于第一种情况,您应该具有以下内容:

for(int i=0; i<subjects.size(); i++){ //for each subject in the list
            Subject subject = subjects.get(i);


            List<Assignment> assignments = subject.getAssignment(); //Get the list of assignments belonging to current subject
            // declare outside the loop
            ArrayList<Double> assignmentGradesAchieved = new ArrayList<Double>(); 
            // collect all the grades
            for(int y=0; y<assignments.size(); y++ ) { //For each assignment in the list 
                Assignment assignment = assignments.get(y);
                if(assignments.get(y).getAssignmentGradeAchieved()!=null) {
                    assignmentGradesAchieved.add(assignments.get(y).getAssignmentGradeAchieved());
                }
            }
            // calculate average
            Double allAssignments = 0;
            for(int z=0; z<assignmentGradesAchieved.size(); z++) {
                allAssignments = allAssignments + assignmentGradesAchieved.get(z);
            } 
            int arraySize = (assignmentGradesAchieved.size()); 
            Double averageAssignGrade = (allAssignments / arraySize);
        }

PD:请小心您的身份。

PD2:这不是最好的方法(并且故意以这种方式编写我发布的解决方案),第二种方法更好。您应该尝试将其作为作业。