3

我正在测试一个包含随机生成数字的不同文本文件的程序。Java 程序被构建为将文本文件中的这些数字相加,取这些数字的平均值,然后(使用 IF 语句)从文本文件中找到大于平均值的数字,将所述值放入ArrayList,并打印平均值和ArrayList作为输出。但是,由于某种原因,当我使用不同的文本文件运行程序时(我使用了两个文件进行了测试,其中一个有效,一个当前无效)。在 shell 中打印的结果不正确 - 大多数值都大于平均值,但我得到一些不正确的值,并且最多相差三个。

这是我的代码:

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 ();
    }

}

从文件中运行它时,我得到平均 79.67,但我的输出如下所示:

The value(s) greater than the mean, 79.67, are (is):
128.0
93.0
143.0
111.0
95.0
116.0
136.0
129.0
141.0
78.0    <-- NOTICE: value is less than the average
93.0
105.0
90.0
90.0
144.0
116.0
136.0
138.0
75.0    <-- NOTICE: value is less than the average
80.0
126.0
75.0    <-- NOTICE: value is less than the average
80.0
98.0
114.0
116.0
86.0
78.0    <-- NOTICE: value is less than the average
123.0
145.0
103.0
111.0
91.0
134.0
119.0
91.0
121.0
113.0
129.0
91.0
116.0
85.0
85.0
126.0
145.0
98.0
115.0
83.0
127.0
119.0
97.0
125.0
121.0
123.0
86.0
108.0
100.0
134.0

我终其一生都无法弄清楚为什么这些价值观会消失。我在另一个包含较少输入值的文本文件上测试了这个程序,一切正常。我是 Java 新手,因为这是我在“Hello World”程序之后的第二个程序,而且我对 Java 语法没有广泛的了解。

4

3 回答 3

10

您正在将值与运行平均值进行比较,而不是最终平均值。第 n 项的比较不考虑第 n+1 项及以后的项目。

于 2014-11-28T18:23:54.970 回答
7

当您决定是否将一个数字添加到 的列表中时The value(s) greater than the mean,您会根据到目前为止处理的数字的部分平均值做出此决定。这就是为什么您在输出元素中看到低于最终平均值的原因。

例如,假设第一个元素为 1,第二个元素为 2。那么前两个元素的平均值为 1.5,由于 2 > 1.5,您将其添加到输出列表中。但是,如果下一个元素大于 2,则最终平均值可能高于 2,因此您的输出将具有低于最终平均值的数字。

您的代码也可能在另一个方向上出错 - 输入开头附近的数字可能会被错误地认为低于平均值,即使它高于最终平均值。

为了获得正确的输出,您必须进行两次迭代。第一个将计算平均值并存储所有输入数字,第二个将找到高于平均值的数字。

于 2014-11-28T18:23:53.253 回答
1

如果你想让这个工作,那么你必须通过输入两次,一次计算平均值,一次计算出哪些超过它。

当您读取第一个值时,您不知道平均值是什么,因此您无法确定它是否大于它!

关键点是均值是输入作为一个整体的属性,因此在您考虑所有这些之前,您无法知道均值。

于 2014-11-28T18:26:31.007 回答