Here's how I'd do it.
You can manage it without an array. Just keep track of the sum of values, sum of values squared, and number of values.
I only added List of grades for display purposes. Not part of mean or variance calculations.
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;
}
}