我正在使用包含随机生成的数字的不同文本文件来测试程序。构建Java程序是为了从文本文件中将这些数字加在一起,取这些数字的平均值,然后(使用IF语句)从文本文件中查找大于平均值的数字,将所述值放入{ {1}},并打印平均值和ArrayList
作为输出。但是,出于某种原因,当我使用不同的文本文件运行我的程序时(我使用两个测试,其中一个工作,而另一个当前没有)。在shell中打印的结果不正确 - 大多数值都大于平均值,但是我得到了一些不是,并且最多只有三个。
这是我的代码:
ArrayList
从文件中运行时,平均得到79.67,但我的输出如下:
package homework.pkg23.average;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
public class Homework23Average {
public static void main(String[] args) {
ArrayList exes = new ArrayList ();
double x = 0;
double y = 0;
Scanner inputStream = null;
try {
inputStream = new Scanner (new File ("MyInput.txt"));
}
catch (FileNotFoundException e) {
System.out.println ("File not found, program aborted:");
System.exit (1);
}
int count = 0;
while (inputStream.hasNextDouble ()) {
count ++;
x = inputStream.nextDouble ();
y += x;
if (x > y/count) // x values greater than the mean
exes.add (x);
}
System.out.println ("The value(s) greater than the mean, "
+ y/count + ", are (is):");
exes.forEach (System.out::println);
inputStream.close ();
}
}
我无法弄清楚为什么这些价值观正在滑落。我在另一个包含较少输入值的文本文件上测试了这个程序,一切正常。我是Java的新手,因为这是我在“Hello World”程序之后的第二个程序,而且我没有Java语法的广泛知识。
答案 0 :(得分:10)
您将值与运行平均值进行比较,而不是最终平均值。第n项的比较没有考虑第n + 1项及以后的项目。
答案 1 :(得分:7)
当您决定是否在The value(s) greater than the mean
列表中添加数字时,您可以根据此处处理的数字的部分平均值来做出此决定。这就是为什么你在输出元素中看到低于最终平均值的原因。
例如,假设第一个元素是1而第二个元素是2.那么前两个元素的平均值是1.5,并且因为2> 1。 1.5,您将它添加到输出列表中。但是,如果下一个元素大于2,则最终平均值可能高于2,因此您的输出将具有低于最终平均值的数字。
你的代码也可能在另一个方向犯错误 - 输入开头附近的数字可能被误认为低于平均值,即使它高于最终平均值。
为了获得正确的输出,您必须进行两次迭代。第一个会计算平均值并存储所有输入数字,第二个会发现数字高于平均值。
答案 2 :(得分:1)
如果你希望这个工作,那么你必须经历两次输入,一次计算平均值,一次计算出哪些超过它。
当你读到第一个值时,你不知道它的意思是什么,所以你不能决定它是否大于它!
关键是平均值是输入整体的属性,所以在你全部考虑之前,你无法知道它们的意思。