【问题标题】:ArrayOutOfBoundsException Error?ArrayOutOfBoundsException 错误?
【发布时间】:2016-07-23 07:25:32
【问题描述】:

我必须创建要使用其他人拥有的主类来实现的类,并且由于某种原因我没有得到正确的输出,我不确定这个错误来自哪里。

预期输出:

中位数 = 44.5

平均值 = 49.300

标准差 = 30.581

public class StatPackage { 
int count; 
double [] scores; 



StatPackage() { 
count = 0; 
scores = new double[500]; 
} 
public void insert (double value) { 
if (count < 500){ 
scores[count] = value; 
++ count; 
} 
} 
public double Mean () { 
    double sum = 0; 
    //For loop for calculating average or mean
    for(int i = 0; i < count; i++){
            sum += (scores[i]);

    }
    double average = sum/count;  
    return average;
    } 

public double Median() { 
int min; 
int tmp; 
int size; 

for (int i = 0; i < count; i ++) 
{ 
min = i; 
for (int pos = i + 1; pos < count; pos ++) 
if (scores [pos] < scores [min]) 
min = pos; 

tmp = (int)scores [min]; 
scores [min] = scores [i]; 
scores [i] = tmp; 

} 
double median = 0;
if  (count % 2 == 0){
    median = (scores[scores.length/2-1] + scores[scores.length/2])/2;
}
else {
    median = (scores[((scores.length/2))]);
}
return median;
} 

public double Variance () { 
    double variance = 0;
    double sum = 0;
    //For loop for getting the variance
    for(int i = 0; i < count; i++){
        sum += scores[i];
        variance += scores[i] * scores[i];

    }
    double varianceFinal = ((variance/count)-(sum*sum)/(count*count));
    return (varianceFinal);
} 

public double StdDev (double variance) { 
    double sum = 0;
    for(int i = 0; i < count; i++){
        sum += scores[i];
        variance += scores[i] * scores[i];

    }
    double varianceFinal = ((variance/count)-(sum*sum)/(count*count));
return Math.sqrt(varianceFinal);

}

【问题讨论】:

  • 但是您不想向我们显示错误堆栈跟踪以帮助定位问题?懒惰
  • 你用什么数据来得到预期的结果???
  • 我不是懒惰看不到错误,因为它来自我将代码放入的其他代码,我没有得到另一个输入给我的输入程序。
  • 首先,你得到了什么输出,因为它不符合预期?其次,这基本上是stackoverflow.com/questions/36389405/…的复制品吗?对于我个人的启迪,是哪所大学给了这个任务?
  • 如果主类没有告诉你堆栈跟踪以便你可以找到问题,那么它写得不好。您必须与编写它的人交谈并告诉他们修复它。

标签: java arrays class exception


【解决方案1】:

您的Median() 方法有问题。尝试改变

if  (count % 2 == 0){
    median = (scores[scores.length/2-1] + scores[scores.length/2])/2;
}
else {
    median = scores[scores.length/2];
}

if (count % 2 == 0)
    median = (scores[count/2] + scores[count/2 - 1])/2;
else
    median = scores[count/2];

因为您有一个包含 500 个元素的固定大小的数组,所以您拥有的代码将返回位置 249 和 250 处的项目的平均值,如果您的数组中的值少于 251 个,则该值将为 0。

【讨论】:

    【解决方案2】:

    出于慈善/精神错乱,我迅速编写了一个驱动程序来尝试测试这个东西。

        public static void main(String[] args)
    {
        StatsPackage sp = new StatsPackage();
        for (int i = 0; i < 101; ++i) {
            sp.insert(i);
        }
    
        System.out.println("count: " + sp.count);
        System.out.println("mean: " + sp.Mean());
        System.out.println("median: " + sp.Median());
        System.out.println("variance: " + sp.Variance());
    }
    

    除了中位数不计算正确的值(@BadCash 可能有解决该问题的方法)之外,没有抛出 ArrayOutOfBounds。

    编辑:按照@BadCash 对 Median 方法的建议进行更新似乎可以解决没有给出正确答案的中位数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2017-05-14
      • 2015-05-07
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多