我创建了一个程序来计算均值,中位数和方差。该程序最多接受500个输入。当有500个输入(我的数组的最大大小)时,我所有的方法都能完美地工作。当输入较少时,仅“均值”计算器起作用。这是整个程序:
public class StatsPackage{
static int i = 0, arrayLength;
static double sum = 0, mean, median, sumOfSquares, variance, stdDev;
static double calcMean (int inputs[], int count) throws IOException{
for (i = 0; i < count; i++){
sum += inputs[i];
}
mean = (sum/count);
return mean;
}
static double calcMedian (int inputs[], int count){
Arrays.sort(inputs);
if (count % 2 == 0){
median = ((inputs[(count/2)] + inputs[(count/2)- 1])/2) ;
}
if (count % 2 != 0){
median = inputs[(count-1)/2];
}
return median;
}
static double calcVariance (int inputs[], int count){
sum = 0;
for (i = 0; i < count; i++){
sumOfSquares += (inputs[i]*inputs[i]);
}
for (i = 0; i < count; i++){
sum = sum + inputs[i];
}
variance = ((sumOfSquares/count) - (sum * sum)/(count * count));
return variance;
}
static double calcStdDev (double varianceInput){
stdDev = Math.sqrt(variance);
return stdDev;
}
public static void main(String[] args) throws IOException {
NumberFormat nf = new DecimalFormat("0.##");
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
BufferedReader stdin = new BufferedReader (new InputStreamReader (System.in));
String str = "test";
int inputs[] = new int [500];
int counter = 0;
int i = 0;
while ((str = stdin.readLine()) != null && i < 500) {
inputs[i] = Integer.parseInt(str);
i++;
counter++;
}
System.out.println("Mean: " + nf.format(StatsPackage.calcMean(inputs, counter)));
System.out.println("Median: " + nf.format(StatsPackage.calcMedian(inputs, counter)));
System.out.println("Variance: " + nf.format(StatsPackage.calcVariance(inputs, counter)));
System.out.println("Standard Deviation: " + nf.format(StatsPackage.calcStdDev(variance)));
}
}
这是输入10个随机数时的示例输出:
均值:47.90
中位数:0.00
方差:0.00
标准偏差:0.00
当输入500个数字(我的数组的最大大小)时,这是相同的代码:
均值:47.27
中位数:47.00
差异:856.71
标准差:29.27
这些输出是一致的。我输入了10个数字,但我只得到了有效的方法。我输入了500个数字,然后所有数字都开始工作。我正在针对另一个测试程序运行该程序,而不是自己在日食中输入数字。测试员程序是我的讲师的程序,我相信他的程序可以正常工作。
谁能帮忙吗?我要把头发扯掉。
最佳答案
问题是您正在初始化大小为500的数组,但是没有使用所有500个索引。那意味着你有一个像这样的数组:
[2,5,3,7,8,2,......,0,0,0,0,0,0,0,0,0,0,0,0]
因此,您的代码将使用所有这些
0
计算中位数和标准差。您应该使用的是ArrayList
。 ArrayList
会随着您添加元素的大小而扩展,而常规列表不能更改大小。如果您不能使用
ArrayList
,则必须做更多的工作。while ((str = stdin.readLine()) != null && i < 500) {
inputs[i] = Integer.parseInt(str);
i++;
counter++;
}
您的
counter
变量已经具有所需的信息。现在,在将此数组传递给mean / median / stddev方法之前,您需要减小数组的大小。最简单的方法是使用提供给所有数组的现有方法,称为CopyOf()
:CopyOf() method for Arraysint[] newArray = Arrays.copyOf(inputs, counter);
现在,在方法调用中用新的
input
替换旧的newArray
数组:System.out.println("Mean: " + nf.format(StatsPackage.calcMean(newArray, counter)));
System.out.println("Median: " + nf.format(StatsPackage.calcMedian(newArray, counter)));
System.out.println("Variance: " + nf.format(StatsPackage.calcVariance(newArray, counter)));
System.out.println("Standard Deviation: " + nf.format(StatsPackage.calcStdDev(variance)));