-1

.dat ファイルから整数を出力し、それらを通常の配列に移動して、平均と標準偏差を出力するコードを作成しました。ここで、通常の配列から ArrayList に切り替えたいと思います。以下のコードを書きましたが、正しく動作していないようです。

.dat ファイルには次の番号が含まれています: "51 52 55 57 58 61 62 63 66 66 66 70 72 73 74 75 75 77 77 78 79 81 82 84 86 87 88 91 94 97"

助けてくれてありがとう!

import java.io.*;
import java.lang.Math;
import java.util.*;
import java.text.DecimalFormat;


public class gradeSorter{

public static void main(String[] args) throws IOException {
{
DecimalFormat fmt = new DecimalFormat("0.000");
Scanner scanner = new Scanner(new File("grades.dat"));
double average;
double deviation;
double sum = 0;
int number = 0;
ArrayList<Integer> element = new ArrayList<Integer>();


for (int count = 0; count < element.size(); count++)
{
while (scanner.hasNext())
{
element.add(scanner.nextInt());
number = element.get(count);
    for (int item : element){
        sum += number;
        System.out.println(number);
}

}

average = sum / element.size();

for (int i = 0; i < element.size(); i++)
{ 
sum += Math.pow((element.get(i) - average),2);

}


deviation = Math.sqrt((sum / (30-1)));




System.out.println("The average of these grades is : " + fmt.format(average));

System.out.println("The standard deviation of these grades is: " + fmt.format(deviation));  


}
}
}
}

アップデート***

import java.io.*;
import java.lang.Math;
import java.util.*;
import java.text.DecimalFormat;


public class gradeSorter{

public static void main(String[] args) throws IOException {
{
DecimalFormat fmt = new DecimalFormat("0.000");
Scanner scanner = new Scanner(new File("grades.dat"));
double average;
double deviation;
double sum = 0;
int number = 0;
int newnumber = 0;
ArrayList<Integer> element = new ArrayList<Integer>();



while (scanner.hasNextInt())
{
element.add(scanner.nextInt());


}
for (int item : element){
        sum += item;
        System.out.println(item);
}

average = sum / element.size();

for (int i = 0; i < element.size(); i++)
{ 
newnumber += Math.pow((element.get(i) - average),2);

}


deviation = Math.sqrt(newnumber / (element.size()));




System.out.println("The average of these grades is : " + fmt.format(average));

System.out.println("The standard deviation of these grades is: " + fmt.format(deviation));  


}
}
}

----jGRASP exec: java gradeSorter

51 52 55 57 58 61 62 63 66 66 66 70 72 73 74 75 75 77 77 78 79 81 82 84 86 87 88 91 94 97

----jGRASP: 操作が完了しました。

4

2 に答える 2

3

創刊:

最初は 0 であるため、ループforは一度も実行されないelement.size()ため、ループの条件は最初の反復でのみ false になります。

for (int count = 0; count < element.size(); count++)

このループを削除するだけです。あなたはそれを必要としません。AnArrayListは動的に成長できます。サイズを気にする必要はありません。

2 番目の問題:

forループ内のループwhileが危険を冒しています。各要素を追加した後、すべての要素の合計を累積します。したがって、sumリストのすべての要素の合計にはなりません。それは要素の合計であり、何度も追加されます。内側のforループを外側に移動する必要がありますwhile:

3 番目の問題:

を使用scanner.hasNext()して int を使用して読み取っていscanner.nextInt()ます。読んでいる要素タイプのみをテストする必要があります。scanner.hasNextInt()読み取り可能な整数をテストするために使用します。

いや、もっとあるかもしれません。ただし、最初にこれらの問題を解決し、コードを実行して、すべての部分が正しいことを確認する必要があります。


全体として、コードのその部分を次のように変更する必要があります。

ArrayList<Integer> element = new ArrayList<Integer>();

// Remove the for loop from here

while (scanner.hasNextInt()) {  // Use scanner.hasNextInt()
    element.add(scanner.nextInt());
}

for (int item : element) {  // Moved this for loop outside the while loop
    sum += item;
}

System.out.println(sum);
于 2013-08-07T19:34:57.077 に答える