计算java中的平均值

时间:2011-08-10 08:56:42

标签: java for-loop count average

编辑:我已经编写了平均值的代码,但我不知道如何制作它以便它也使用来自我的args.length而不是数组的整数

我需要编写一个可以计算的java程序:1。读入的整数数量2.平均值 - 不必是整数!

请注意!我不想计算数组的平均值,而是计算args中的整数。

目前我写的是:

int count = 0;
    for (int i = 0; i<args.length -1; ++i)
        count++;
    System.out.println(count);

     }

int nums[] = new int[] { 23, 1, 5, 78, 22, 4};
double result = 0; //average will have decimal point
    {
    for(int i=0; i < nums.length; i++){
    result += nums[i];
    }
    System.out.println(result/count)
 }

有人能引导我朝正确的方向前进吗?或者举一个例子来指导我用写入方式来塑造这段代码?

提前致谢

10 个答案:

答案 0 :(得分:6)

只需对您的代码进行一些小修改(为了清晰起见,使用一些var重命名):

double sum = 0; //average will have decimal point

for(int i=0; i < args.length; i++){
   //parse string to double, note that this might fail if you encounter a non-numeric string
   //Note that we could also do Integer.valueOf( args[i] ) but this is more flexible
   sum += Double.valueOf( args[i] ); 
}

double average = sum/args.length;

System.out.println(average );

请注意,循环也可以简化:

for(String arg : args){
   sum += Double.valueOf( arg );
}

编辑:OP似乎想要使用args数组。这似乎是一个String数组,因此相应地更新了答案。

<强>更新

正如zoxqoj正确指出的那样,上面的代码中没有处理整数/双溢出。虽然我假设输入值足够小,不会出现这个问题,但这里有一个用于非常大的输入值的片段:

BigDecimal sum = BigDecimal.ZERO;
for(String arg : args){
  sum = sum.add( new BigDecimal( arg ) );
}

这种方法有几个优点(尽管速度稍慢,所以不要将其用于时间关键操作):

  • 精确度保持不变,你会在数学运算次数的基础上逐渐失去精度(或根本不会得到精确的精度)
  • 实际上消除了溢出的可能性。但请注意,BigDecimal可能大于适合doublelong的内容。

答案 1 :(得分:3)

int values[] = { 23, 1, 5, 78, 22, 4};

int sum = 0;
for (int i = 0; i < values.length; i++)
    sum += values[i];

double average = ((double) sum) / values.length;

答案 2 :(得分:2)

for (int i = 0; i<args.length -1; ++i)
    count++;

基本上再次计算args.length,只是错误地(循环条件应为i<args.length)。为什么不直接使用args.length(或nums.length)?

否则您的代码似乎没问题。虽然看起来好像你想从命令行读取输入,但不知道如何将其转换为数字数组 - 这是你真正的问题吗?

答案 3 :(得分:0)

 System.out.println(result/count) 

您不能这样做,因为result / count不是String类型,System.out.println()只接受String参数。也许试试:

double avg = (double)result / (double)args.length

答案 4 :(得分:0)

为1.读入的整数数量,您可以使用数组的长度属性,如:

int count = args.length

,它不会为数组中的元素提供任何内容。 并且2.计算平均值:  你正在以正确的方式做事。

答案 5 :(得分:0)

而不是:

int count = 0;
for (int i = 0; i<args.length -1; ++i)
    count++;
System.out.println(count);

 }

你可以

int count = args.length;

平均值是你的args之和除以你的args的数量。

int res = 0;
int count = args.lenght;

for (int a : args)
{
res += a;
}
res /= count;

您也可以缩短此代码,我会让您试着询问您是否需要帮助!

这是我的第一个答案,告诉我是否有问题!

答案 6 :(得分:0)

如果你试图从命令行args获取整数,你需要这样的东西:

public static void main(String[] args) {
    int[] nums = new int[args.length];
    for(int i = 0; i < args.length; i++) {
        try {
            nums[i] = Integer.parseInt(args[i]);
        }
        catch(NumberFormatException nfe) {
            System.err.println("Invalid argument");
        }
    }

    // averaging code here
}

至于实际的平均代码,其他人已经建议你如何调整它(所以我不会重复他们所说的)。

编辑:实际上将它放在上面的循环中并且根本不使用nums数组可能更好

答案 7 :(得分:0)

我会告诉你两种方式。如果您在项目中不需要很多统计数据,只需执行以下操作即可。

public double average(ArrayList<Double> x) {
    double sum = 0;
    for (double aX : x) sum += aX;
    return (sum / x.size());
}

如果你计划做很多统计数据,那么也不要重新发明轮子。那么为什么不查看http://commons.apache.org/proper/commons-math/userguide/stat.html

你会落入真正的luv!

答案 8 :(得分:0)

public class MainTwo{
    public static void main(String[] arguments) {
        double[] Average = new double[5];
        Average[0] = 4;
        Average[1] = 5;
        Average[2] = 2;
        Average[3] = 4;
        Average[4] = 5;
        double sum = 0;
        if (Average.length > 0) {
            for (int x = 0; x < Average.length; x++) {
                sum+=Average[x];
                System.out.println(Average[x]);
            }
            System.out.println("Sum is " + sum);
            System.out.println("Average is " + sum/Average.length);
      }
   }
}

答案 9 :(得分:0)

这似乎是旧线程,但是Java从那时起就得到了发展,并在Java 8中引入了Streams和Lambda。

  • 在您的情况下,您要将String []的args转换为double 或int。您可以使用Arrays.stream(<arr>)进行此操作。一旦有了String数组元素流,就可以使用mapToDouble(s -> Double.parseDouble(s)),它将把String的流转换为double的流。
  • 如果您想自己控制增量计算,则可以使用Stream.collect(supplier, accumulator, combiner)来计算平均值。这是some good example
  • 如果您不想逐步进行平均,则可以直接使用Java的Collectors.averagingDouble()直接计算并返回平均值。一些examples here