2016-04-03 4 views
-5

他の人が持っているメインクラスで実装するクラスを作成する必要があります。何らかの理由で適切な出力が得られない場合、このエラーの原因がわかりません。ArrayOutOfBoundsExceptionエラー?

予想される出力:

中央値= 44.5

平均= 49.300

SD = 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); 

} 
+4

しかし、問題の特定に役立つエラースタックトレースを表示したくないですか?怠け者 – pczeus

+0

期待した結果を得るためにどのデータを使用していますか? –

+0

私は怠け者ではありません。エラーが表示されないのは、自分のコードを入れたコードから来たもので、別のプログラムによって入力が与えられた入力を取得できません。 – swaguire

答えて

0

あなたのMedian()方法で問題を抱えています。あなたは500個の要素を持つ固定サイズの配列を持っているので、あなたが持っているコードはされる、位置249および250での項目の平均値を返します

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

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

を変更してみてください配列に251未満の値がある場合は0を返します。

0

慈善/精神不足の中で、私はすぐにこのことをテストしようとするドライバープログラムを書きました。

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投げはありません。

EDIT:@BadCashは中央値方式に示唆されているように更新を行う正しい答えを与えていない中央値を解決しているようです。

関連する問題