如何操作数组。查找平均值。初学者Java。

9
我是一名有用的助手,可以为您翻译文本。以下是您需要翻译的内容:

我有一个作业任务,想知道是否有人能帮我,因为我对Java和编程还很陌生,卡在了一个问题上。这个问题是:

第一个方法找到整数数组元素的平均值:

public double average(int[] data)

也就是说,给定一个整数数组data,计算它的元素的平均值并返回该平均值。例如,{1,3,2,5,8}的平均值为3.8。

下面是我迄今为止所做的内容:

public double average(int[] data) {  
    int sum = 0;

    while(int i=0; i < data.length; i++) 

    sum = sum + data[i]; 
    double average = sum / data.length;; 

    System.out.println("Average value of array element is " " + average);
}

当我编译时,int i=0 的部分会出现错误信息,提示“需要.class文件”。希望能得到帮助。


2
@DanglingPiyush 不需要,问题很清楚。 - Marko Topolnik
2
你的空格使用很容易让人误解。通常为了清晰,我们建议在for/while循环周围加上大括号,而你目前的写法非常容易让人产生歧义。请参考此 pastebin 以更好地了解我的意思。 - Andrzej Doyle
8个回答

18

使用增强for循环会更好:

int sum = 0;
for (int d : data) sum += d;

还有一件可能会让你大吃一惊的事情是,你将从中获得错误的结果

double average = sum / data.length;

原因:在右侧,您使用整数除法,Java不会自动将其提升为浮点除法。它将计算 sum/data.length 的整数商,然后才将该整数提升为 double。解决方法是:

double average = 1.0d * sum / data.length;

这将强制将被除数转换为double,自动传递给除数。


2
可以通过将sum最初分配为double,或者在除法线上显式转换其中一个参数来解决整数除法问题,例如:double average = ((double)sum) / data.length; - Andrzej Doyle
1
@AndrzejDoyle 我不建议使用 double sum 作为通用解决方案,因为对于大于2^54(或者是2^56?)的整数会导致精度损失。无论如何,这是一个相当大的数字,但仍然存在更清晰的替代方案,为什么要这样做呢? - Marko Topolnik
你还应该注意到 data.length == 0 这种边缘情况,它会抛出除以零的错误。double average = (data.length > 0) ? (double) sum / data.length : 0.0; - James McGuigan
值得注意的是,在实践中,(double) sum / data.length没有括号也可以正常工作。强制类型转换优先于数学运算符,因此((double) sum)变为隐式,然后除法运算符传播双精度类型。个人认为这种写法更易读,因为最终结果是安全地将整个除法操作进行强制转换。http://bmanolov.free.fr/javaoperators.php - James McGuigan
它不会抛出任何错误,0.0 / 0.0 的结果是 NaN,这是回答“空列表的平均值是多少”的最佳方式。 - Marko Topolnik
显示剩余2条评论

9
Java 8 的流式 API 提供了一种优雅的替代方案:
public static void main(String[] args) {
    double avg = Arrays.stream(new int[]{1,3,2,5,8}).average().getAsDouble();

    System.out.println("avg: " + avg);
}

应该这样写:(int) Arrays.stream(new int[]{}).average().orElse(0.0);,以处理空数组的 OptionalDouble.empty 返回值。.average() 默认返回一个 double,但如果需要可以进行强制转换。 - James McGuigan

7
-while(int i=0; i < data.length; i++) 
+for(int i=0; i < data.length; i++) 

LOL。怎么没人注意到这个? - RAY
@RAY 这是统一差异格式的一部分 http://en.wikipedia.org/wiki/Diff#Unified_format - CyberDem0n
我知道。只是有趣的是似乎没有人注意到这么明显的事情。 - RAY

0

找到一组数字的平均值最好的方法是尝试使用......

public static void main(String[] args) {
    average(1,2,5,4);

}

public static void average(int...numbers){
    int total = 0;
    for(int x: numbers){
        total+=x;
    }
    System.out.println("Average is: "+(double)total/numbers.length);

}

0

试试这个方法

public void average(int[] data) {  
    int sum = 0;
    double average;

    for(int i=0; i < data.length; i++){
        sum = sum + data[i];
    }
    average = (double)sum/data.length;
    System.out.println("Average value of array element is " + average);    
}

如果你需要返回平均值,你需要使用double关键字而不是void关键字,并且需要返回值return average

public double average(int[] data) {  
    int sum = 0;
    double average;

    for(int i=0; i < data.length; i++){
        sum = sum + data[i];
    }
    average = (double)sum/data.length;
    return average;    
}

0
  double[] numArray = { 45.3, 67.5, -45.6, 20.34, 33.0, 45.6 };
    double sum = 0.0;

    for (double num: numArray) {
       sum += num;
    }

    double average = sum / numArray.length;
    System.out.format("The average is: %.2f", average);

-2
如果我们想要对一个数组中的数字进行求和并计算它们的平均值,可以按照以下简单的方法操作!......
public class Array {

    public static void main(String[] args) {

        int[]array = {1,3,5,7,9,6,3};
        int i=0;
        int sum=0;
        double average=0;
        for( i=0;i<array.length;i++){
            System.out.println(array[i]);
            sum=sum+array[i];
        }
        System.out.println("sum is:"+sum);
        System.out.println("average is: "+(double)sum/vargu.length);



    }

}

Vargu来自哪里?为什么要声明平均变量而不使用它?为什么要在循环外部声明fori循环迭代变量? - skubski

-2

有几个问题:

while 应该改为 for

你没有返回值,但是你声明了一个 double 类型的返回类型

double average = sum / data.length;;

sum和data.length都是整数,所以除法将返回一个整数-检查你的类型

双分号可能不会破坏它,只是看起来有点奇怪。


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