在Java中计算平均值

3

编辑: 我已经编写了计算平均值的代码,但我不知道如何使它使用我的args.length 中的int而不是数组。

我需要编写一个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)

有谁可以指引我正确的方向?或者给我一个示例来指导我如何编写这段代码?

提前感谢。


3
args.length已经包含了你的count,所以不需要第一个for循环。你的问题是什么?你是否在寻求改进?你的代码能否正常工作?你想知道如何将args[]转换为int数组? - Jacob
int count = args.length; 用来获取参数的数量. - mj.scintilla
这两个代码有关系吗?因为在第二个for循环中,您正在使用计数。 - Android Killer
相关链接:http://stackoverflow.com/questions/6993060/simple-calculator-program-in-java-no-of-integers-read-and-average/ - Qwerky
抱歉我没有表达清楚,我已经写了计算平均数的代码,但是我不知道如何让它使用我的args.length中的整数而不是数组。 - syncoroll
11个回答

9

只需对您的代码进行一些小的修改即可(为了更清晰,需要重命名一些变量):

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数组。这似乎是一个字符串数组,因此已相应地更新了答案。

更新:

正如zoxqoj正确指出的那样,在上面的代码中没有考虑整数/双精度浮点数溢出问题。尽管我认为输入值足够小,不会有这个问题,但以下是一个用于处理大输入值的代码片段:

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

尽管这种方法有点慢,因此不要在时间关键操作中使用,但它具有几个优点:

  • 精度得到保留,使用double时,随着数学运算的次数增多,您将逐渐失去精度(或者根本无法获得精确的数字)
  • 实际上可以消除溢出的可能性。但请注意,BigDecimal 可能比适合于 double 或 long 的更大。

如果我使用args.lengths而不是nums.length,那么我该如何修改"sum += nums[i];"这一行代码? - syncoroll
整数溢出没有得到处理。 - banjara
1
你应该检查是否为0 == args.length,如果不这样做,那么当args.length为0时,在double average = sum/args.length;行会出现“除零错误”。 - Developer Marius Žilėnas
2
@MariusŽilėnas 你说得对,可能还会出现一些其他错误,但为了简单起见,在 OP 的情况下,这些错误被省略了,留给实现者处理。 - Thomas
@Andromeda 你说得对,我已经在两个片段中都修复了它。 - Thomas
显示剩余3条评论

4
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

This

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

基本上是再次计算args.length,只不过不正确(循环条件应该是i<args.length)。为什么不直接使用args.length(或nums.length)呢?
否则您的代码似乎没问题。虽然看起来好像您想要从命令行读取输入,但不知道如何将其转换为数字数组 - 这是您真正的问题吗?

1

虽然这篇文章看起来有些过时,但是自那时以来Java已经发展并引入了Java 8中的Streams和Lambdas。因此,使用Java 8的特性可能会帮助所有想要进行编程的人。

  • 在您的情况下,您想将String[]类型的args转换为double或int。您可以使用Arrays.stream(<arr>)实现这一点。一旦您有了String数组元素的流,您就可以使用mapToDouble(s -> Double.parseDouble(s))将字符串流转换为双精度流。
  • 然后,如果您想要控制渐进计算,您可以使用Stream.collect(supplier, accumulator, combiner)来计算平均值。这里有some good example
  • 如果您不想逐步进行平均值计算,您可以直接使用Java的Collectors.averagingDouble()来直接计算并返回平均值。这里有一些examples here

0
 System.out.println(result/count) 

你不能这样做,因为result/count不是字符串类型,而System.out.println()只接受一个字符串参数。也许尝试:

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

0

对于读入的整数数量,您可以直接使用数组的 length 属性,例如:

int count = args.length

这个函数可以给你数组中元素的数量。 而且,如果你正在计算平均值,你的方法是正确的。


0

不是:

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

 }

你可以直接

int count = args.length;

平均数是您的参数之和除以您的参数数量。

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

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

你也可以让这段代码更短,如果需要帮助可以试着问一下!

这是我的第一个答案,如果有什么不对的地方请告诉我!


我在使用args时遇到了错误。"Exception in thread "main" java.lang.Error: Unresolved compilation problem: Type mismatch: cannot convert from element type String to int" - syncoroll
请注意,res /= count 将执行整数除法,因此几乎肯定会产生错误的结果(OP 表示平均值可能包含小数点)。 - Thomas
@syncoroll,你没有告诉我们args实际上是什么 - 因此可能会认为它是int[] args。最有可能的是你有一个String[] args(这是一个main方法,对吧?)- 因此你需要将for循环更改为for(String a:args)并在内部调用res + = Integer.parseInt(a) - Thomas
你知道,我不会为你的作业测试代码!这只是一种方法,一个算法..它应该能够工作,这取决于你的变量类型.. - GrandMarquis

0
如果您想从命令行参数中获取整数,您需要类似这样的代码:
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数组。

0

//问题:使用循环从键盘接收10个整数,并在屏幕上打印它们的平均值。 //这里要求用户使用循环输入10个整数并计算这些数字的平均值。所以我认为使用Java编写的正确答案如下:

import java.util.Scanner;

public class averageValueLoop {
    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            int sum = 0;
            for (int i = 0; i < 10; i++){
                System.out.print("Enter a number: ");
                sum = sum + sc.nextInt();
            }

            double average = sum / 10;
            System.out.println("Average is " + average);

        }

    }

}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接