我创建了一个程序来计算均值,中位数和方差。该程序最多接受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计算中位数和标准差。您应该使用的是ArrayListArrayList会随着您添加元素的大小而扩展,而常规列表不能更改大小。

如果您不能使用ArrayList,则必须做更多的工作。

while ((str = stdin.readLine()) != null && i < 500) {
            inputs[i] = Integer.parseInt(str);
            i++;
            counter++;
        }


您的counter变量已经具有所需的信息。现在,在将此数组传递给mean / median / stddev方法之前,您需要减小数组的大小。最简单的方法是使用提供给所有数组的现有方法,称为CopyOf()CopyOf() method for Arrays

int[] 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)));

10-07 13:14
查看更多