添加并查找数组中的平均值

时间:2012-06-20 18:41:09

标签: java arrays

我试图创建一个程序来检索用户输入的无穷无尽的数字,然后它会告诉您输入了多少个数字,所有数字的总和,然后是数字的平均值。是我到目前为止的代码。我不知道它为什么不起作用。我没有错误,但它没有得到有效的总和或平均值。

import javax.swing.*;

public class SumAverage {
    public static float sum;
    public static float averageCalculator;
    public static float average;
    public static void main(String[]args) {
        float numbers[] = null;
        String userInput = JOptionPane.showInputDialog(null, "Ready to begin?");
        if(userInput.equalsIgnoreCase("no"))
        {
            System.exit(0);
        }
        for(int i = 0; i != -2; i++)
        {
            numbers = new float[i + 1];
            userInput = JOptionPane.showInputDialog(null, "Input any number. Input * to exit");
            if(userInput.length() == 0 || userInput.equals("*") || userInput.equals(null))
            {
                break;
            }
            else 
            {
                numbers[i] = Float.parseFloat(userInput);   
            }
        }
        for (int i = 0; i < numbers.length; i++)
        {
            sum += numbers[i];
        }

        average = sum / numbers.length;

        JOptionPane.showMessageDialog(null, "The sum of all your numbers is " + sum + ". The average is " + average + ". You entered a total of " + numbers.length + " numbers.");
    }
}

3 个答案:

答案 0 :(得分:5)

问题出在这一行:

 numbers = new float[i + 1];

您正在创建一个新数组,但不是将分配给numbers的上一个数组中的值复制到其中。

您可以通过两种方式解决此问题:

  • 使用System.arraycopy()复制值(您需要使用新变量进行调用,然后将其分配给numbers
  • 请勿使用数组!请改用List<Float>,其大小会自动增大

通常,应避免使用数组,尤其是“应用程序逻辑”。尽量使用集合 - 它们有许多强大而方便的方法。

如果您想存储这些数字供以后使用,请尝试使您的代码如下所示:

List<Float> numbers = new ArrayList<Float>();
...
numbers.add(Float.parseFloat(userInput));
...
for (float n : numbers) {
    sum += n;
}
average = sum / numbers.size();  // Note: Don't even need a count variable

最后,如果您不需要存储数字,只需保留一笔运行金额并计算并避免任何类型的数字存储。

答案 1 :(得分:3)

与Q无关,但请注意,您可以计算运行计数/平均值而不存储所有输入数据 - 或者假设您要保留输入 - 而不是在每次迭代时遍历它。伪代码:

count = 0
sum = 0
while value = getUserInput():
  count++
  sum += value
  print "average:" + (sum / count)

答案 2 :(得分:2)

numbers = new float[i + 1];

您正在每次迭代时创建一个全新的数组。这意味着你总是创建一个新的数组,每次迭代时它的大小会增加1,但只有一个字段填充当前用户输入并且所有其他字段都是空的。

删除此行并在之前初始化数组。

如果数组的大小应在循环内动态增长 根本不使用数组,而是使用动态数据结构,如List或ArrayList。

此外我建议使用

while (true) {

    //...
}

实现无限循环。