-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: javagradeSorter

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 这些等级的平均值为:73.233 这些等级的标准差为:12.288

----jGRASP:操作完成。

4

2 回答 2

3

首要问题:

您的for循环甚至不会运行一次,因为element.size()最初为 0,因此循环的条件仅在第一次迭代时为假:

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

只需删除此循环。你不需要它。一个ArrayList可以动态增长。您无需担心它的大小。

第二期:

for循环内的循环while正在造成危险。添加每个元素后,它将累积所有元素的总和。因此,您sum不会是列表中所有元素的总和。这将是元素的总和,添加了很多次。您应该将内部for循环移到while:

第三期:

您正在使用scanner.hasNext()和阅读 int using 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 回答
0

删除你的 for 循环,事情应该运行得很好。只要有这个:

public static void main(String[] args) throws IOException {
{
....
....
while (scanner.hasNext())
{
    number = scanner.nextInt();
    element.add(number);
    for (int item : element)
    {
        sum += number;
        System.out.println(number);
    }
}
average = sum / element.size();
....
....
....

您得到的错误详细信息也会很有用。

于 2013-08-07T19:55:18.093 回答