2013-09-29 84 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; 
    } 
}