首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java获取数组列表中某些元素的平均值

Java获取数组列表中某些元素的平均值
EN

Stack Overflow用户
提问于 2021-03-13 03:21:48
回答 3查看 329关注 0票数 0

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

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

这是我用来创建数组列表的代码:

代码语言:javascript
运行
复制
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. ";
    }
}

这是学生类的代码:

代码语言:javascript
运行
复制
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;
    }
}   

我试过像这样的东西

代码语言:javascript
运行
复制
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;
}

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

编辑:

基于这里的答案和我已经完成的一些工作,这是最终的代码:

代码语言:javascript
运行
复制
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) + ".";

    }  

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

感谢大家的反馈。

EN

回答 3

Stack Overflow用户

发布于 2021-03-13 03:58:01

构建它的正确方法是,首先,您需要将Student抽象为一个类。简单的方法是在主类中创建一个数组属性students,在Student类中它将有一个名为subjects的属性Map来放置一个键(主题名称)和值(成绩)。

如果我理解正确,你需要将一些学生放在主数组中,他们的成绩,然后计算每个科目所有这些学生的平均值,要计算这一点,你需要创建另一个Map,并通过键(主题)和所有出现的事件进行交互,然后按计数拆分。

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

票数 1
EN

Stack Overflow用户

发布于 2021-03-13 09:45:42

你的方式

使用你的代码,假设你的三个等级中的每一个按位置代表三个不同的课程。

因此,循环学生,分别拉动每个年级。

代码语言:javascript
运行
复制
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() ) ;
}

将点数除以要渲染平均值的分数。

如果需要float结果,请不要将float (小数)除以int (整数)。因此,在进行除法运算之前,我们必须将int转换为float

代码语言:javascript
运行
复制
float frenchAverage = ( frenchPoints / (float) students.size() ) ;
…

我的方式

正如Answer by Bruno Souza Picinini中所建议的,在更现实的场景中,您应该将数据分解为单独的类。您可能会在一个类中表示Student,而该类又可能包含一个CourseGrade类的对象集合。

在Java16中,我们可以使用新的records特性来简单地编写一个类,该类的主要目的是透明和不可变地传递数据。编译器隐式地创建构造函数、getters、equals & hashCodetoString

代码语言:javascript
运行
复制
public record CourseGrade(String courseName , YearMonth term , Float grade) {}
代码语言:javascript
运行
复制
public record Student(UUID id , String name , Set < CourseGrade > courseGrades) {}

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

代码语言:javascript
运行
复制
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;
}

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

我们报告Optional是因为我们可能在没有提供此类课程的情况下要求在一个学期内提供课程。因此,如果没有课程,那么就没有学生获得任何分数。因此,我们要报告一个空的Optional对象,而不是报告一个数字。如果在该学期中提供了一门课程,并有学生注册,那么我们将返回一个包含Float对象的Optional,用于表示平均成绩的数量。

顺便说一句,注意像float/Float trade away inaccuracy for speed of execution这样的浮点类型。如果您关心准确性,请改用BigDecimal类。

代码语言:javascript
运行
复制
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中,以驱动演示。

代码语言:javascript
运行
复制
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运行时。

代码语言:javascript
运行
复制
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.22.7,3.0 )的平均值是2.96…。

票数 1
EN

Stack Overflow用户

发布于 2021-03-13 04:59:28

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

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

我们用SchoolSubject.java表示一个主题:

代码语言:javascript
运行
复制
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<>();
}
}

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

代码语言:javascript
运行
复制
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));
    }
}
}

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

代码语言:javascript
运行
复制
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));
    }
}
}

用于科目类的年级类。

代码语言:javascript
运行
复制
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;
}
}

学生班级:

代码语言:javascript
运行
复制
public class Student {

}

您的应用程序。你运行这个文件。

代码语言:javascript
运行
复制
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());
}
}

类来生成随机名称:

代码语言:javascript
运行
复制
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();
}
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66605982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档