简体   繁体   English

计算通用数组的平均值方法

[英]Calculate Average method for a generic Array

Consider the AverageTest class to calculate and print the average of all int values of array.考虑使用 AverageTest class 来计算并打印数组的所有 int 值的平均值。

    public class AverageTest {

    public static double calculateAverage (int [] sales) {

        double total = 0;

        for (int i = 0; i < sales.length; i++) {
            total += sales[i];
        }
        return total/sales.length;  
    }

    public static void main (String [] args) {

        int sales [] = {40,78,34,65,67};

        // double array won't work for the calculateAverage() method
        // double sales[] = {45.7, 8.9, 3.4};  

        double salesAverage = AverageTest.calculateAverage(sales); // error in the line for double type array
        System.out.println("Average =" + salesAverage);

    }

}

I have to write the generic version of calculateAverage() method so that argument can be of any type rather than restricted to int type.我必须编写 calculateAverage() 方法的通用版本,以便参数可以是任何类型,而不是仅限于 int 类型。 Basically I want to use the same calculateAverage method to output the average of an int array or a double array.基本上我想对 output 使用相同的 calculateAverage 方法来计算 int 数组或 double 数组的平均值。

I tried doing this:我试过这样做:

        public static <E> double calculateAverage (E[] sales) {

        double total = 0;

        for (int i = 0; i < sales.length; i++) {
            total += sales[i];
        }
        return total/sales.length;  
    }

But then it says that I can't use the '+' operator to sum elements of a generic Array.但后来它说我不能使用“+”运算符来对通用数组的元素求和。 Is there any other way?还有其他方法吗?

You have to create custom interface Adder and pass that to the calculateAverage(..)您必须创建自定义接口 Adder 并将其传递给 calculateAverage(..)

public interface Adder<T> {
        T zero();
        T add(T a,T b);
    }

public class AverageTest {

    public  static <T extends Number> double calculateAverage (T [] sales,Adder<T> adder) {

        T total=adder.zero();

        for (T e: sales ) {
           total=adder.add(total,e);
        }
        return total.doubleValue()/sales.length;
    }

    public static void main (String [] args) {

        Integer sales [] = {40,78,34,65,67};


        double salesAverage = AverageTest.calculateAverage(sales, new Adder<Integer>() {
            @Override
            public Integer zero() {
                return 0;
            }

            @Override
            public Integer add(Integer a, Integer b) {
                return a+b;
            }
        });
        System.out.println("Average =" + salesAverage);

    }

}

Here is my Answer:这是我的答案:

import java.util.ArrayList;

public class Average {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        ArrayList<Integer> emptyList = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        try {
            System.out.println(getAverage1(list));
            System.out.println(getAverage2(emptyList));
        } catch (ArithmeticException e) {
            e.getMessage();
        }
    }

    public static <T extends Number> double getAverage1(ArrayList<T> nums) {
        double sum = 0.0;
        for (T n : nums) {
            sum = sum + n.doubleValue();
        }
        return sum / nums.size();
    }

    public static double getAverage2(ArrayList<? extends Number> nums) {
        double sum = 0.0;
        for (Number n : nums) {
            sum = sum + n.doubleValue();
        }
        return sum / nums.size();
    }
}

Check the result here.这里检查结果。

You can use with Number [] and its works good:您可以使用Number []并且效果很好:

    public static double calculateAverage (Number[] sales) {

        double total = 0;

        for (int i = 0; i < sales.length; i++) {
            total += sales[i].doubleValue();
        }
        return total/sales.length;  
    }

    public static void main (String [] args) {

        Number salesIntValues [] = {40,78,34,65,67};


        Number salesDoublesValues[] = {45.7, 8.9, 3.4};  

        double salesAverageInt =  AverageTest.calculateAverage(salesIntValues); 
        System.out.println("Average =" + salesAverageInt);

        double salesAverageDouble =  AverageTest.calculateAverage(salesDoublesValues); 
        System.out.println("Average =" + salesAverageDouble);

    }

}

Output: Output:

Average =56.8
Average =19.333333333333332

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM