【问题标题】:How to extract numbers from Two-Dimensional Array of Objects in Java如何从Java中的二维对象数组中提取数字
【发布时间】:2016-11-02 19:03:49
【问题描述】:

我有一个二维对象数组,其中填充了学生姓名和成绩。每个学生都有自己的行,第一列包含学生姓名,然后接下来的 4 列包含考试成绩。我需要找到每个学生测试的平均值,但我不知道如何平均每行的双精度值。我还需要找到数据库中所有测试的平均值。有人可以告诉我如何做到这一点吗?

public class StudentGrades extends javax.swing.JFrame {
    Object[][] database = new Object[14][5];
    int studentCount = 0;

...

private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                               
    //declare variables
    double grade1 = Double.parseDouble(test1.getText());
    double grade2 = Double.parseDouble(test2.getText());
    double grade3 = Double.parseDouble(test3.getText());
    double grade4 = Double.parseDouble(test4.getText());
    String name = firstInput.getText() + " " + lastInput.getText() + ":";

    if (grade1 >= 0 & grade1 <= 100 & grade2 >= 0 & grade2 <= 100 & grade3   >= 0 & grade3 <= 100 & grade4 >= 0 & grade4 <= 100){

        //add data
        database[studentCount][0] = name;
        database[studentCount][1] = grade1; 
        database[studentCount][2] = grade2;
        database[studentCount][3] = grade3;
        database[studentCount][4] = grade4;

        //add to student count
        studentCount = studentCount + 1;

        //limit number of students
        if (studentCount == 15){
            addButton.setEnabled(false);
        }
    }  
    else {
        errorLabel.setText("Please Enter Valid Data.");
    }

【问题讨论】:

  • 您是否需要使用数组数组?或者这就是你选择解决这个问题的方式?如果您可以选择设计,您可能需要考虑创建一个包含姓名和成绩列表的 Student 类。
  • 不要使用这种数据结构。使用带有字符串键和List&lt;Integer&gt; 值的地图之类的东西。此外,您可能对 Java 8 Stream API 中包含的归约函数感兴趣。
  • 1.您不应该为此使用Object[][] database。 2. 你是如何计算平均值的?
  • 为此使用对象。双值数组不是存储数据的好方法,这些数据应该表示为带有成绩列表的学生对象。这样做会使阅读变得更加困难。
  • 本程序要求我使用二维数组。

标签: java arrays multidimensional-array average


【解决方案1】:

一个合理的Student类设计的例子可能是这样的(实现留空):

import java.util.List;
import java.util.ArrayList;

public class Student {
    private String name;
    private List<Double> grades;

    public Student(String name) {
        // TODO 
    }

    public void addGrade(double grade) {
        // TODO
    }

    public double average() {
        // TODO 
    }

    public String toString() {
        return String.format(
            "Student: %s\nAverage Grade: %f\n", 
            this.name, 
            this.average()
        );
    }
}

class TestStudent {
    public static void main(String[] args) {
        Student s = new Student("Hunter");
        s.addGrade(100);
        s.addGrade(90);
        s.addGrade(0);
        s.addGrade(85);
        s.addGrade(75);
        System.out.println(s);
    }
}

【讨论】:

    【解决方案2】:

    使用您当前拥有的代码:

    Object[][] database = new Object[14][5];
    

    我们可以添加一些内容,使其对读者更友好

    final int STUDENTS = 14;
    final int GRADES = 4;
    Object[][] database = new Object[STUDENTS][GRADES + 1];
    

    为了能够检查平均值

    public double getStudentAverageGrade(Object[] student)
    {
        for(int i = 0; i < GRADES; i++) // forEach grade
        {
            gradesSummatory += (double) student[i + 1]; // plus one is added since we ignore first value (which is students name)
        }
        return gradesSummatory/GRADES;
    }
    

    现在,为了能够查看所有学生的平均值,这更容易,因为我们只需实现之前创建的方法。

    public double getAverageGrade()
    {
        double avgSummatory = 0;
        for (int i = 0; i < STUDENTS; i++)
        {
            avgSummatory += getStudentAverageGrade(database[i]);
        }
        return avgSummatory/STUDENTS;
    }
    

    这么说我不认为它是一个真正的最佳解决方案(你可以将所有元素相加并只除一次),但它是最具表现力的非面向对象的解决方案。我宁愿将这些元素/对象抽象成不同的类,例如 Student,以便尽可能地重用代码。但是对于这种情况,这可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2016-08-26
      相关资源
      最近更新 更多