2016-11-02 14 views
0

私は2次元のオブジェクト配列を持ち、学生の名前と成績で埋められます。各生徒には独自の行があり、最初の列には生徒の名前が表示され、次に4つの列にはテスト成績が含まれます。各生徒のテストの平均を見つける必要がありますが、各行の2倍の値を平均する方法はわかりません。私はまた、データベース内のすべてのテストの平均を見つける必要があります。誰かが私にこれを行う方法を教えてもらえますか?Javaのオブジェクトの2次元配列から数値を抽出するには

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."); 
    } 
+1

配列の配列を使用する必要がありますか?それとも、この問題を解決するために選んだのでしょうか?デザインを選択できる場合は、名前とグレードの一覧をカプセル化するStudentクラスを作成することを検討してください。 –

+0

このデータ構造は使用しないでください。文字列キーと 'List '値を持つマップのようなものを使用してください。また、Java 8 Stream APIに含まれる削減関数にも興味があります。 – ifly6

+1

1.これには 'Object [] [] database'を使用すべきではありません。 2.どのように平均を計算しようとしましたか? – bradimus

答えて

1

合理学生クラスのデザインは、このような何か(実装は空白のまま)可能性の例:あなたとして

コードを使用する
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); 
    } 
} 
0

現在:

Object[][] database = new Object[14][5]; 
私たちは、平均を見ることができるようにするために、今、平均値

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; 
} 

をチェックすることができるようにするために、読者

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

にそれをより使いやすくするためにいくつかのことを追加することができます3210

すべての生徒のうち、以前に作成したメソッドを実装するだけで済むので簡単です。

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

これを言って、私はそれが本当に最適なソリューションであることは考えていない(あなたはすべての要素を合計して一度だけ分割できます)が、それは芋最も表現非オブジェクト指向のソリューションです。私はこれらの要素/オブジェクトをむしろ学生のような異なるクラスに抽象化して、可能な限りコードを再利用したいと考えています。しかし、この場合は、これはトリックを行うことができます。

関連する問題