当前位置: 首页 > 知识库问答 >
问题:

Java获取Arraylist中某些元素的平均值

安星汉
2023-03-14

我是新来的Java,我正在写一个程序来管理学生,他们的科目和该科目的成绩。

代码询问学生的详细信息,然后将所有信息保存到Arraylist。我试图得到一个科目的平均成绩,但没有成功,我已经计算了某个学生的平均成绩,但是从某个科目获得所有成绩,然后计算平均成绩超出了我的理解范围。

这是我用于创建Arraylist的代码:

public class options {

public String name;

public ArrayList<students> studentlist = new ArrayList<students>(10);  

    public String createstudent(String name, String subject, Float rade1, Float grade2, Float grade3) {
        studentlist.add(new students(name, subject, grade1, grade2, grade3);
        return "The student has been added to the database. ";
    }
}

这是学生班的代码:

public class students{
    
    public String name;
    public String subject;
    public Float grade1;  
    public Float grade2;  
    public Float grade3;
    
   public students(String name, String subject, Float grade1, Float grade2, Float grade3) {
        
        this.name= name;
        this.subject= subject;
        this.grade1= grade1;
        this.grade2= grade2;
        this.grade3= grade3;
    }
}   

我试过类似的方法

public double getAverageValue(){
  double averageValue = 0;
  double sum = 0;

  if(studentlist.size() > 0){
    for ( int i=0; i < studentlist.size() ; i++) {
      sum += studentlist.get(i).getname().getgrade1().getgrade2().getgrade3();
    }
    averageValue = (sum / (double)studentlist.size())
  }

  return averageValue;
}

但是我不知道如何只选择某个学科的成绩,而不是所有学生的所有成绩,所以我有点被卡住了。

编辑:

根据这里的答案和我已经做过的一些工作,这是最后的代码:

public String showAverageGrade(String clase){
        int countstudents =0;
        double studentaverage =0;

        for(int i=0 ; i < studentlist.size();i++){
            if(studentlist.get(i).asksubject().equals(subject)){
                studentaverage +=studentlist.get(i).studentaverage ();
                countstudents++;

            }
        }
        return "The average grade of " + subject + " is " + (studentaverage / countstudents) + ".";

    }  

英语不是我的母语,所以任何错误都是因为我翻译了它。

谢谢大家的反馈。

共有3个答案

蓟俊杰
2023-03-14

这些解决方案使您能够为每个科目的每个学生键入一个等级,然后输出所有已评分科目的平均值。

将每个类作为自己的文件添加到文件夹中。

我们用学校科目来代表一个科目。爪哇:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//abstract class. is init from sub classes
public abstract class SchoolSubjects {

//grades in a subject
protected List<Grade> studentGrades;
Scanner myInput = new Scanner(System.in);

abstract double getAverageValue();

abstract void gradeStudents(List<Student> students) throws IOException;

public SchoolSubjects() {
    this.studentGrades = new ArrayList<>();
}
}

然后我们为每个主题创建一个类:

import java.io.IOException;
import java.util.List;

public class EnglishSubject extends SchoolSubjects {

//constructor
public EnglishSubject() {
    super();
}

//Overrides method in super class
@Override
double getAverageValue() {
    double sum = 0;
    if (!studentGrades.isEmpty()) {
        for (Grade grade : studentGrades) {

            sum += grade.getGrade();
        }
        return sum / studentGrades.size();
    }
    return sum;
}


//Overrides method in super class
//parameter: List of students to be graded.
//Takes console input for grade.
//generates random name to represent student
@Override
void gradeStudents(List<Student> students) throws IOException {
    System.out.println("Grade for english subject");
    for (Student student : students) {
        System.out.print("Student:" + " " + RandomNames.randomIdentifier() + " " + 
"Enter grade: ");
        double grade = myInput.nextDouble();
        studentGrades.add(new Grade(grade, student));
    }
}
}

另一个主题使用相同的方法。请记住,由于继承,每个主题中的方法都可以更改:

import java.io.IOException;
import java.util.List;

public class MathSubject extends SchoolSubjects {

//constructor
public MathSubject() {
    super();
}

//Overrides method in super class
@Override
double getAverageValue() {
    double sum = 0;
    if (!studentGrades.isEmpty()) {
        for (Grade grade : studentGrades) {

            sum += grade.getGrade();
        }
        return sum / studentGrades.size();
    }
    return sum;
}

//Overrides method in super class
//parameter: List of students to be graded.
//Takes console input for grade.
//generates random name to represent student
@Override
void gradeStudents(List<Student> students) throws IOException {
    System.out.println("Grade for math subject");
    for (Student student : students) {
        System.out.print("Student:" + " " + RandomNames.randomIdentifier() + " " + 
"Enter grade: ");
        double grade = myInput.nextDouble();
        studentGrades.add(new Grade(grade, student));
    }
}
}

用于科目类的年级类。

public class Grade {
//has a grade, and a student object
private double grade;
public Student student;

public double getGrade() {
    return grade;
}

public Grade(double grade, Student student) {
    this.grade = grade;
    this.student = student;
}
}

学生班级:

public class Student {

}

你的申请。你运行这个文件。

public class App {
public static void main(String[] args) throws Exception {
 
    //School
    List<Student> studentList = new ArrayList<>();
    studentList.add(new Student());
    studentList.add(new Student());
    studentList.add(new Student());


    SchoolSubjects mathSubject = new MathSubject();
    SchoolSubjects englishSubject = new EnglishSubject();

    mathSubject.gradeStudents(studentList);
    englishSubject.gradeStudents(studentList);

    System.out.println("Average grade math:" + " " + mathSubject.getAverageValue());
    System.out.println("Average grade english:" + " " + 
englishSubject.getAverageValue());
}
}

类生成随机名称:

import java.util.HashSet;
import java.util.Set;

public class RandomNames {
// class variable
final static String lexicon = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345674890";

//final java.util.Random rand = new java.util.Random();

// consider using a Map<String,Boolean> to say whether the identifier is being used 
or not
final static Set<String> identifiers = new HashSet<String>();

public static String randomIdentifier() {
    StringBuilder builder = new StringBuilder();
    while (builder.toString().length() == 0) {
        int length = new java.util.Random().nextInt(5) + 5;
        for (int i = 0; i < length; i++) {
            builder.append(lexicon.charAt(new 
java.util.Random().nextInt(lexicon.length())));
        }
        if (identifiers.contains(builder.toString())) {
            builder = new StringBuilder();
        }
    }
    return builder.toString();
}
}
濮阳旺
2023-03-14

使用您的代码,您的三个等级(按职位划分)可能代表三个不同的课程。我假设你把“法语”课的所有成绩都放在grade1字段中,“作文”课的成绩放在grade2字段中,“数学”课的成绩放在grade3字段中。

所以循环学生,分别抽取每个年级。

float frenchPoints = 0 ;
float compositionPoints = 0 ;
float mathPoints = 0 ;
for( Student student : students )
{
    frenchPoints = ( frenchPoints + student.getGrade1() ) ;
    compositionPoints = ( compositionPoints + student.getGrade2() ) ;
    mathPoints = ( mathPoints + student.getGrade3() ) ;
}

将点除以等级数以获得平均值。

如果希望得到浮点结果,请不要将浮点(小数)除以整数。因此,在进行除法之前,我们必须将int转换为float

float frenchAverage = ( frenchPoints / (float) students.size() ) ;
…

正如Bruno Souza Picinini在回答中所建议的那样,在一个更现实的场景中,您可以将数据分成不同的类。您可能会在类中表示Student,而类又可能包含CourseGrade类的对象集合。

在Java16中,我们可以使用NewRecords特性简单地编写一个类,其主要目的是透明和不可变地传输数据。编译器隐式地创建构造函数getter,equals

public record CourseGrade(String courseName , YearMonth term , Float grade) {}
public record Student(UUID id , String name , Set < CourseGrade > courseGrades) {}

让我们获取一些示例数据。

private List < Student > fetchStudents ( )
{
    List < Student > students =
            List.of(
                    new Student( UUID.fromString( "57ce6790-5094-480c-88f5-79ee9e59b9bb" ) , "Alice" ,
                            Set.of(
                                    new CourseGrade( "French" , YearMonth.of( 2021 , Month.JANUARY ) , 3.2F ) ,
                                    new CourseGrade( "French" , YearMonth.of( 2021 , Month.APRIL ) , 3.6F ) ,
                                    new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.JANUARY ) , 3.3F ) ,
                                    new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.APRIL ) , 3.7F )
                            )
                    ) ,
                    new Student( UUID.fromString( "3ed40f58-fb82-44f0-9ae8-7cc1b317085e" ) , "Bob" ,
                            Set.of(
                                    new CourseGrade( "French" , YearMonth.of( 2021 , Month.JANUARY ) , 2.7F ) ,
                                    new CourseGrade( "French" , YearMonth.of( 2021 , Month.APRIL ) , 2.6F ) ,
                                    new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.JANUARY ) , 2.9F ) ,
                                    new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.APRIL ) , 2.7F )
                            )
                    ) ,
                    new Student( UUID.fromString( "9058567e-8a5e-4606-81b0-1def2bb8ceb5" ) , "Carol" ,
                            Set.of(
                                    new CourseGrade( "French" , YearMonth.of( 2021 , Month.JANUARY ) , 3.0F ) ,
                                    new CourseGrade( "French" , YearMonth.of( 2021 , Month.APRIL ) , 3.1F ) ,
                                    new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.JANUARY ) , 3.2F ) ,
                                    new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.APRIL ) , 3.4F )
                            )
                    )
            );
    return students;
}

写一个方法来报告特定学期特定课程名称的平均成绩。

我们报告了一个可选的,因为我们可能会在没有此类课程的情况下要求一个学期的课程。因此,如果没有课,那么就没有学生获得任何分数。因此,我们不想报告一个数字,而是要报告一个空的可选对象。如果在该学期开设了一门课程,且学生已注册,那么我们将返回一个可选,其中包含一个浮动对象,表示平均分数。

顺便说一句,请注意,浮点类型(如float/float等)以不精确性换取执行速度。如果您关心准确性,请改用BigDecimalclass。

private Optional < Float > reportAverageGradePerCourseInTerm ( String courseName , YearMonth term )
{
    Objects.requireNonNull( courseName );
    Objects.requireNonNull( term );
    List < CourseGrade > courseGrades = new ArrayList <>( this.students.size() );
    for ( Student student : this.students )
    {
        for ( CourseGrade courseGrade : student.courseGrades() )
        {
            if ( courseGrade.courseName().equals( courseName ) && courseGrade.term().equals( term ) )
            {
                courseGrades.add( courseGrade ); // If a match on name and term, remember this `CourseGrade` object. Else, forget/skip.
            }
        }
    }
    if ( courseGrades.size() == 0 ) { return Optional.empty(); }
    float totalPoints = 0F;
    for ( CourseGrade courseGrade : courseGrades )
    {
        totalPoints = totalPoints + courseGrade.grade();
    }
    Float average = ( totalPoints / ( float ) courseGrades.size() );
    return Optional.of( average );
}

使用main方法将所有代码拉入类App,以驱动演示。

package work.basil.example.reportcard;

import java.time.Month;
import java.time.YearMonth;
import java.util.*;

public class App
{
    public static void main ( String[] args )
    {
        App app = new App();
        app.students = app.fetchStudents();
        System.out.println( "app.students = " + app.students );
        Optional < Float > averageForFrenchIn2021_01 = app.reportAverageGradePerCourseInTerm( "French" , YearMonth.of( 2021 , Month.JANUARY ) );
        System.out.println( "averageForFrenchIn2021_01 = " + averageForFrenchIn2021_01 );
    }

    // Member fields
    List < Student > students;

    // Logic

    private List < Student > fetchStudents ( )
    {
        List < Student > students =
                List.of(
                        new Student( UUID.fromString( "57ce6790-5094-480c-88f5-79ee9e59b9bb" ) , "Alice" ,
                                Set.of(
                                        new CourseGrade( "French" , YearMonth.of( 2021 , Month.JANUARY ) , 3.2F ) ,
                                        new CourseGrade( "French" , YearMonth.of( 2021 , Month.APRIL ) , 3.6F ) ,
                                        new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.JANUARY ) , 3.3F ) ,
                                        new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.APRIL ) , 3.7F )
                                )
                        ) ,
                        new Student( UUID.fromString( "57ce6790-5094-480c-88f5-79ee9e59b9bb" ) , "Bob" ,
                                Set.of(
                                        new CourseGrade( "French" , YearMonth.of( 2021 , Month.JANUARY ) , 2.7F ) ,
                                        new CourseGrade( "French" , YearMonth.of( 2021 , Month.APRIL ) , 2.6F ) ,
                                        new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.JANUARY ) , 2.9F ) ,
                                        new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.APRIL ) , 2.7F )
                                )
                        ) ,
                        new Student( UUID.fromString( "57ce6790-5094-480c-88f5-79ee9e59b9bb" ) , "Carol" ,
                                Set.of(
                                        new CourseGrade( "French" , YearMonth.of( 2021 , Month.JANUARY ) , 3.0F ) ,
                                        new CourseGrade( "French" , YearMonth.of( 2021 , Month.APRIL ) , 3.1F ) ,
                                        new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.JANUARY ) , 3.2F ) ,
                                        new CourseGrade( "Composition" , YearMonth.of( 2021 , Month.APRIL ) , 3.4F )
                                )
                        )
                );
        return students;
    }

    private Optional < Float > reportAverageGradePerCourseInTerm ( String courseName , YearMonth term )
    {
        Objects.requireNonNull( courseName );
        Objects.requireNonNull( term );
        List < CourseGrade > courseGrades = new ArrayList <>( this.students.size() );
        for ( Student student : this.students )
        {
            for ( CourseGrade courseGrade : student.courseGrades() )
            {
                if ( courseGrade.courseName().equals( courseName ) && courseGrade.term().equals( term ) )
                {
                    courseGrades.add( courseGrade ); // If a match on name and term, remember this `CourseGrade` object. Else, forget/skip.
                }
            }
        }
        if ( courseGrades.size() == 0 ) { return Optional.empty(); }
        float totalPoints = 0F;
        for ( CourseGrade courseGrade : courseGrades )
        {
            totalPoints = totalPoints + courseGrade.grade();
        }
        Float average = ( totalPoints / ( float ) courseGrades.size() );
        return Optional.of( average );
    }
}

当运行main时。

app.students = [Student[id=57ce6790-5094-480c-88f5-79ee9e59b9bb, name=Alice, courseGrades=[CourseGrade[courseName=French, term=2021-04, grade=3.6], CourseGrade[courseName=French, term=2021-01, grade=3.2], CourseGrade[courseName=Composition, term=2021-01, grade=3.3], CourseGrade[courseName=Composition, term=2021-04, grade=3.7]]], Student[id=57ce6790-5094-480c-88f5-79ee9e59b9bb, name=Bob, courseGrades=[CourseGrade[courseName=French, term=2021-04, grade=2.6], CourseGrade[courseName=French, term=2021-01, grade=2.7], CourseGrade[courseName=Composition, term=2021-01, grade=2.9], CourseGrade[courseName=Composition, term=2021-04, grade=2.7]]], Student[id=57ce6790-5094-480c-88f5-79ee9e59b9bb, name=Carol, courseGrades=[CourseGrade[courseName=French, term=2021-04, grade=3.1], CourseGrade[courseName=Composition, term=2021-01, grade=3.2], CourseGrade[courseName=Composition, term=2021-04, grade=3.4], CourseGrade[courseName=French, term=2021-01, grade=3.0]]]]
averageForFrenchIn2021_01 = Optional[2.9666665]

看起来是正确的,(3.2 , 2.7 , 3.0 )的平均值是2.96......

易书
2023-03-14

架构这个的正确方法是首先,你需要抽象学生作为一个类。简单的方法是在主类中创建一个学生属性数组,在学生类中它将有一个属性Map称为主题,以放入一个键(主题名称)和值(等级)。

如果我理解正确,你需要把一些学生放在主数组中,他们的成绩,然后计算每个科目所有这些学生的平均值,要计算这个,你需要创建另一个地图,并通过键(主题)和所有发生的事情进行交互,然后由数数。

以一种简单的方式,您已经知道所有主题类型,如果您不知道,它将更加复杂,在计算之前,您需要另一个没有重复类型的列表进行过滤和交互,这里可能会解释一种创建这个没有重复类型的新列表的方法:https://www.baeldung.com/java-remove-duplicates-from-list.

 类似资料:
  • 本文向大家介绍获取元素在Java ArrayList中的位置,包括了获取元素在Java ArrayList中的位置的使用技巧和注意事项,需要的朋友参考一下 可以使用方法java.util.ArrayList.indexOf()获得ArrayList中元素的位置。此方法返回指定元素首次出现的索引。如果该元素在ArrayList中不可用,则此方法返回-1。 演示此的程序如下所示- 示例 输出结果 现在

  • 问题内容: 是否有一些函数可以从某些列表中返回N个最高元素? 即,如果返回单个最高元素sth。就像会给我返回10个最高数字的列表(如果较小则更少)。 或获得这些有效的简便方法是什么?(除了明显的规范实现;而且,没有这样的事情需要首先对整个列表进行排序,因为与规范解决方案相比效率不高。) 问题答案: :

  • 问题内容: 我无法获得熊猫列的平均值或均值。有一个数据框。我在下面尝试的任何事情都没有给我该列的平均值 以下返回几个值,而不是一个: 这样: 问题答案: 如果您只想要列的均值,请选择列(这是一个系列),然后调用:

  • 这里是初学者。我试图找到任何问题可以解决这个问题,但我不能,所以我提前道歉,如果这最终是一个重复。 因此,我有一个Double[]名为pay,包含三个Double值(totalPay、basePay、HoursWorkd),我将其存储在一个名为paylist的ArrayList中。 我在寻找一种方法来确定平均总工资,平均基本工资和平均工作小时数,我尝试使用foreach,但它似乎不起作用。 (当用

  • 我有一个Staff类,其中包含特定工作人员的角色列表。我还有staffList,它保存staff对象。 如果我只是使用get索引直接从rolesList中获取值,它将不会显示任何问题。 我认为它得到的是rolesList的一个版本,但不是那个特定的Staff对象中的版本 我已经在roleList中创建了一个新的Staff成员和一个角色,然后在构造Staff对象时使用了列表,因此使用该对象的getR

  • 问题内容: 我需要以下程序的帮助: “编写一种将二维双精度数组作为输入参数并返回数组元素平均值的方法。” 谁能告诉我该怎么做? 我当前的代码: 我不知道如何让用户输入数组元素和数组尺寸(行/列)。另外,如何从main调用此方法?我遇到错误。 问题答案: 试试这个: 码: 输出: