2013-09-29 82 views
1

我很努力地爲我的作業找到標準偏差,我做了所有其他事情,我只是在最後一點掙扎。我的作業問題簡而言之是: 我給出了一組學生的任務結果文本文件(必須是任意數字)。唯一給出的數據是學生姓名,球迷及其結果,你需要計算他們的平均成績和標準差。輸出應該是這樣的:查找2D陣列的標準偏差

Student Name  FAN  Part 1 Part 2 Part 3 Part 4 Mark Grade 
Adam Adamson  adam0001 85.4 79.8 82.4 86.1 82.77% DN 
Bethany Bright brig0001 89.7 85.6 84.2 82.9 84.92% DN 
Cameron Carlson carl0001 55.45 49.82 60.4 42.27 50.23% P 
David Dawson  daws0001 72.6 78.49 80.2 65.88 74.46% CR 
Evelyn Ellis  elli0001 50.2 35.88 48.41 58.37 46.57% FA 
Frances Fitz  fitz0001 78.9 75.67 82.48 79.1 78.38% DN 
Greg Gregson  greg0001 24.3 32.88 29.72 28.4 30.05% F 
Harriett Hope hope0001 52.2 58.93 61.5 63.44 60.12% P 
Ivan Indigo  indi0001 88.4 91.23 90.05 92.46 91.08% HD 
Jessica Jones jone0001 82.33 89.74 81.3 84.85 85.84% HD 
        Average 67.948 67.804 70.066 68.377 68.44% CR 
               StdDev 19.4442 

我知道我需要使用的公式,我知道我需要用我只是不知道如何讓他們哪些號碼。我會告訴你什麼,我需要做的,所以希望你會明白我的代碼進一步下跌:

the total of the averages divided by 10 = 68.442 

sum = (82.77-68.442)^2 + (84.92-68.442)^2 + (50.23-68.442)^2 + ... + (85.84-68.442)^2 
StdDev = Math.sqrt(sum/10) 

stdDev = 19.4442 

我使用3類此,我的主類欄目管理,一個學生類,其中包含與數組學生姓名和風扇(也不是我的問題確實相關,但我想我最好剛纔設置的場景),最後是StudentsMarks類,它包含了我StdDec方法如下顯示:

public static double StdDev() throws IOException 
{ 
    String [][] marks = StudentMarks.StudentMarks(); 

    double mean = 0, average = 0, stdDev = 0; 
    int row = 0; 
    for(row = 0; row < marks.length; row++) 
    {           //ROW,COL 
     double score1 = Double.parseDouble(marks[row][2]); //parsing the data from the array into a double 
     double score2 = Double.parseDouble(marks[row][3]); 
     double score3 = Double.parseDouble(marks[row][4]); 
     double score4 = Double.parseDouble(marks[row][5]); 

     average = score1*0.1 + score2*0.4 + score3*0.2 + score4*0.3; 

     mean = average/row; 
     stdDev = Math.sqrt(Math.pow(average - mean,2)/row); 
    } 
    return stdDev; 
} 
+0

不應平均和平均來計算整個數據集?你總是覆蓋以前計算的值! – isnot2bad

+0

你是否應該爲整個考試中的每個學生計算平均值和stddev,還是爲每個學生的考試計算平均值和stddev? – Joni

+0

@ isnot2bad是的,我知道它每次都會覆蓋它。我不知道如何計算平均值。對於我只需要打印它們的另一部分來說,這很好,但這一部分我正因爲這個確切原因而苦苦掙扎。 – JavaRookie

回答

1

u需要2路因爲你需要從每一行中減去平均值。

double[] sum = new double[marks.length]; 

for(row = 0; row < marks.length; row++) 
{           //ROW,COL 
    double score1 = Double.parseDouble(marks[row][2]); //parsing the data from the array into a double 
    double score2 = Double.parseDouble(marks[row][3]); 
    double score3 = Double.parseDouble(marks[row][4]); 
    double score4 = Double.parseDouble(marks[row][5]); 

    sum[row] = score1*0.1 + score2*0.4 + score3*0.2 + score4*0.3; 
    average += sum[row]; 
} 
average = average/sum.length; //1 
for(row = 0; row < sum.length; row++) 
{ 
     mean += Math.pow(Math.abs(sum[row] - average),2);   
} 
mean = mean/marks.length;//2 
stdDev = Math.sqrt(mean); 
+0

退貨8.273。這很接近,但仍然不存在! 雖然謝謝! – JavaRookie

+0

@JavaRookie我不明白你計算總和的方式。爲什麼你乘以.1,.2? – Ankit

+0

對不起,0.1,0.2是每個作業/考試的權重。 – JavaRookie

0

下面是我該怎麼做。

您可以在沒有陣列的情況下管理它。只需跟蹤值的總和,值的平方和和值的數量。

我只添加了顯示用的等級列表。不是平均值或方差計算的一部分。

package reportcard; 

import org.apache.commons.lang3.StringUtils; 

/** 
* Student 
* @author Michael 
* @link http://stackoverflow.com/questions/19077442/finding-the-standard-deviation-from-a-2d-array 
* @since 9/29/13 12:19 PM 
*/ 
public class Student { 

    private final String name; 

    public Student(String name) { 
     if (StringUtils.isBlank(name)) throw new IllegalArgumentException("Name cannot be blank or null"); 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     Student student = (Student) o; 

     if (!name.equals(student.name)) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     return name.hashCode(); 
    } 

    @Override 
    public String toString() { 
     final StringBuilder sb = new StringBuilder("Student{"); 
     sb.append("name='").append(name).append('\''); 
     sb.append('}'); 
     return sb.toString(); 
    } 
} 

package reportcard; 

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

/** 
* Transcript 
* @author Michael 
* @link http://stackoverflow.com/questions/19077442/finding-the-standard-deviation-from-a-2d-array 
* @since 9/29/13 12:21 PM 
*/ 
public class Transcript { 
    private final Student student; 
    private final List<Double> grades; 
    private double sum = 0.0; 
    private double sumsq = 0.0; 
    private int numGrades = 0; 

    public static void main(String[] args) { 
     Student student = new Student("Fatty Arbuckle"); 
     Transcript transcript = new Transcript(student); 
     double [] grades = { 2, 4, 4, 4, 5, 5, 7, 9 }; 
     for (double grade : grades) { 
      transcript.addGrade(grade); 
     } 
     System.out.println(transcript); 

    } 

    public Transcript(Student student) { 
     if (student == null) throw new IllegalArgumentException("Student cannot be null"); 
     this.student = student; 
     this.grades = new ArrayList<Double>(); 
    } 

    public void addGrade(double grade) { 
     if (grade > 0.0) { 
      this.grades.add(grade); 
      ++this.numGrades; 
      this.sum += grade; 
      this.sumsq += grade*grade; 
     } 
    } 

    public double getMean() { 
     double mean = 0.0; 
     if (this.numGrades > 0) { 
      mean = this.sum/this.numGrades; 
     } 
     return mean; 
    } 

    public double getVariance() { 
     double stddev = 0.0; 
     if (this.numGrades > 0) { 
      stddev = Math.sqrt((this.sumsq-this.sum*this.sum/this.numGrades)/this.numGrades); 
     } 
     return stddev; 
    } 

    @Override 
    public String toString() { 
     final StringBuilder sb = new StringBuilder("Transcript{"); 
     sb.append("student=").append(student); 
     sb.append(", grades=").append(grades); 
     sb.append(", sum=").append(sum); 
     sb.append(", sumsq=").append(sumsq); 
     sb.append(", numGrades=").append(numGrades); 
     sb.append(", mean=").append(this.getMean()); 
     sb.append(", variance=").append(this.getVariance()); 
     sb.append('}'); 
     return sb.toString(); 
    } 
} 

package reportcard; 

/** 
* Grade encapsulates grades with values 
* @author Michael 
* @link http://stackoverflow.com/questions/16744116/java-grade-class-letter-grade-to-number/16744210#16744210 
* @since 5/24/13 6:01 PM 
*/ 
public enum Grade { 
    APLUS("A+", 4.3), 
    A("A", 4.0), 
    AMINUS("A-", 3.7), 
    BPLUS("B+", 3.3), 
    B("B", 3.0), 
    BMINUS("B-", 2.7), 
    CPLUS("C+", 2.3), 
    C("C", 2.0), 
    CMINUS("C-", 1.7), 
    DPLUS("D+", 1.3), 
    D("D", 1.0), 
    DMINUS("D-", 0.7), 
    F("F", 0.0); 

    private final String symbol; 
    private final double value; 

    Grade(String symbol, double value) { 
     this.symbol = symbol; 
     this.value = value; 
    } 

    public String getSymbol() { 
     return symbol; 
    } 

    public double getValue() { 
     return value; 
    } 
}