ArrayList有两个元素,是否可能找到int元素的平均值?

3
这个小项目由两个类和一个ArrayList组成。ArrayList有两个元素:`name`和`score`。能否找出`score`元素的平均值?
`classroom`类:
/**
 * This class creates the names and scores of the students
 */
public class Classroom
{
public int score;
public String name;

/**
 * Constructor for the Class that adds a name and a score.
 */
public Classroom(String aName, int aScore)
{
    score = aScore;
    name = aName;
}

/**
 * Return the name of the students
 */
public String returnName()
{
    return name;
}

/**
 * Return the scores
 */
public int returnScore()
{
    return score;
}
}

TestScores

import java.util.ArrayList;
/**
 * Print test scrose and student names as well as he average for the class.
 */
public class TestScores
{
private ArrayList<Classroom> scores;
public int studentScores;

/**
 * Create a new ArrayList of scores and add some scores
 */
public TestScores()
{
    scores = new ArrayList<Classroom>();
}

/**
 * Add a new student and a new score.
 */
public void add (String name, int score)
{
    scores.add(new Classroom(name, score));
        if(score > 100){
            System.out.println("The score cannot be more than 100");
        }

}

您是否可以使用for each循环,在教室类中创建一个局部变量来存储从returnScore方法返回的学生分数,并将其除以数组大小?


你可以遍历 ArrayList 来查找所有分数,将它们相加以计算平均值。 - mahbubcsedu
...或者使用Java 8流,这使整个过程更加简洁。 - Florian Schaetz
我建议您三种方法,看看我的答案。 - Andrew Tobilko
考虑将您的getter命名为getXxx,而不是returnXxx。 - JHH
4个回答

4
使用Java 8的流,这应该可以完成工作。
public double getAvg(){
    return scores.stream()
                 .mapToInt(x -> x.returnScore())
                 .average()
                 .getAsDouble();
}

2
我建议使用ClassRoom::returnScore而不是x -> x.returnScore(),但这可能是个人偏好。当然,流是一个高级话题,所以我建议先坚持“手动”方式,直到你对Java足够熟练。 - Florian Schaetz
@FlorianSchaetz 是的,我一开始考虑使用方法引用来完成它,但后来改变了主意,以确保OP理解正在发生的事情。 - Yassin Hajaj
1
完全合法,但是当然,由于原始问题是“我能使用循环来...”这样的问题,我认为OP在理解任何情况之前还有一些路要走;-) - Florian Schaetz
是的,很抱歉我还没有学习流,但当我把它放进去时它可以工作! - feelingstoned
@feelingstoned 另一种方法是使用循环等。但是这需要编写大量代码,而效果却很小 :) 这种方法更好。这就是我们学习的方式。当然,随意接受答案。 - Yassin Hajaj

3
如果您在循环中针对您的“分数”中的每个元素使用 returnScore(),并将每个 returnScore()添加到本地变量中,然后将该变量除以 scores.Size() ,您应该得到您要寻找的内容。如果我误解了问题,请告诉我。请在TestScores类中执行此操作。

所以这应该可以做到,但它没有打印出平均分,而是每个人的得分。我在这里做错了什么? public void average() { for(Classroom average : scores){ System.out.println("班级平均分是 " + (average.returnScore()/scores.size())); } } - feelingstoned
等等,我弄错了。让我修复它。 - feelingstoned

1
简单的解决方案是在数组列表上运行for循环,计算分数之和并除以数组大小。
但是请在您的TestScores类或其他类中执行此操作。ClassRoom是个体成绩,因此无法将总分或平均分存储在该类中。
其次,您的建模不正确。您称之为ClassRoom,而它只能有一个学生及其分数。
另外,在您的add方法中,您对得分> 100的检查是在添加得分之后进行的。您应该先检查,仅当得分不大于100时才将其添加到列表中。

当然,使用Java 8,我们现在有了Streams,这将更加优雅。 - Florian Schaetz
当然,在Java 8中,我们有优雅的解决方案。 - Bhushan Bhangale
是的,我在测试分数中编写了一个方法。谢谢! - feelingstoned

0
另一种方法是在Classroom类中添加两个静态变量:totalScoretotalStudents。然后在Classroom的构造函数中增加这两个变量(totalScore ++,totalStudents ++)。 最后,您可以在Classroom类中创建一个静态方法来获取平均值:
public static double getAverage(){
    return (double)totalScore/(double)totalStudents;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接