【问题标题】:ArrayList has two elements, is it possible to find an average of the int element?ArrayList 有两个元素,是否可以求 int 元素的平均值?
【发布时间】:2016-03-13 18:41:22
【问题描述】:

这个小项目由两个类和一个ArrayList组成。 ArrayList 有两个元素:namescore。是否可以求元素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并找到所有分数,将它们相加计算平均值。
  • ...或者使用 Java 8 流,这使得整个事情更加简洁。
  • 我建议你三种方式,看我的回答
  • 考虑将你的getter命名为getXxx,而不是returnXxx。

标签: java arraylist average


【解决方案1】:

使用 Java 8 流,这应该可以完成工作

public double getAvg(){
    return scores.stream()
                 .mapToInt(x -> x.returnScore())
                 .average()
                 .getAsDouble();
}

【讨论】:

  • 我建议ClassRoom::returnScore 而不是x -&gt; x.returnScore(),但这可能是个人喜好。当然,Streams 是一个高级主题,所以我建议先坚持“手动”方式,直到熟练掌握 Java。
  • @FlorianSchaetz 是的,我想先使用方法参考来做这件事,但后来改变了主意,以确保 OP 了解正在发生的事情。
  • 完全合法,但当然,由于最初的问题是“我可以使用循环...”,我认为 OP 在理解之前还有一段路要走无论如何;-)
  • 是的,很抱歉我还没有学过流,但是我把它放进去就可以了!
  • @feelingstoned 另一种方法是循环等。但是它的代码太多了,结果却很少:) 这种方法更好。这就是我们学习的方式。当然,请随意接受答案。
【解决方案2】:

如果您在循环中为scores 中的每个元素returnScore(),并将每个returnScore() 添加到一个局部变量,然后将该变量除以scores.Size(),您应该会得到您要查找的内容。如果我误解了这个问题,请告诉我。在您的 TestScores 类中执行此操作。

【讨论】:

  • 所以应该这样做,但它不会打印平均数,而是每个人的分数。我在这里做错了什么? public void average() { for(Classroom average : scores){ System.out.println("班级平均分是" + (average.returnScore()/scores.size())); } }
  • 等等,我完全搞砸了。让我解决它
【解决方案3】:

简单的解决方案是在数组列表上运行一个 for 循环并计算分数的总和并除以数组大小。

但是在您的 TestScores 类或其他类中执行此操作。 ClassRoom 是个人分数,因此您无法存储该班级的总分或平均分。

其次,您的建模不正确。您称它为 ClassRoom,而它只能有一个学生及其分数。

此外,在您的添加方法中,您对分数 > 100 的检查是在您添加分数之后。您应该在之前检查,如果它不大于 100,则仅添加到列表中。

【讨论】:

  • 当然,有了 Java 8,我们现在有了 Streams,它会更优雅。
  • 当然,Java 8 我们有优雅的解决方案
  • 是的,我在测试分数中写了一个方法。谢谢!
【解决方案4】:

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

public static double getAverage(){
    return (double)totalScore/(double)totalStudents;
}

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2013-12-29
    相关资源
    最近更新 更多