[英]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();
}
}
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.