【问题标题】:How to find avg value of two different arrays (Double and integer)如何找到两个不同数组(双精度和整数)的平均值
【发布时间】:2021-09-25 21:53:00
【问题描述】:

我必须找到这个泛型类的平均值 code

class Array <T> {
    private T[]array;
    
    public Array(T[] array) {
        this.array = array;
    }
    public T get (int index) {
        return array[index];
    }
    public int length() {
        return array.length;
    }
}

使用这两个数组:

Array<Integer>set1 = new Array<>(new Integer[] {1 ,2 , 4, 5});

Array<Double>set2 = new Array<>(new Double[] {1.0 ,3.0, 5.0});

有人能解释一下它是如何工作的吗?

【问题讨论】:

  • 将值相加并除以数组的长度有什么问题?
  • 您可以确定T extends Number,然后在每个元素上调用doubleValue(),将它们相加,然后除以长度。如果您还希望平均值为 T 类型,则没有通用方法可以实现它(使用反射除外)。
  • 对于不受约束的 Ts 这是不可能的,因为应该是 Strings "this""that" 的平均值。
  • 我实际上试图在一个周期内找到这两个数组的平均值。我的意思是,创建独特的循环来查找两个数组的平均值
  • double sumOfList2(List list1) { double s = 0.0;像这样?

标签: java arrays generics java-8 average


【解决方案1】:

如 cmets 中所述,Array 类的定义应如下所示,以便计算数组元素的平均值:

public class Array<T extends Number> {
// ...
}

那么 avg 方法可以使用 Stream API 像这样实现:

public double avg() {
    if (length() == 0) {
        return 0.0; // prevent NaN for empty array
    }
    return Arrays.stream(array)
                 .filter(Objects::isNotNull)
                 .mapToDouble(Number::doubleValue).sum() / length();
}

或使用DoubleStream::average()

public double avg() {
    return Arrays.stream(array)
                 .filter(Objects::isNotNull)
                 .mapToDouble(Number::doubleValue) // DoubleStream
                 .average() // OptionalDouble
                 .orElse(0.0); // or .orElseGet(() -> 0.0)
}

也可以使用普通循环:

public double avg() {
    if (length() == 0) {
        return 0.0;
    }

    double sum = 0.0;
    for (T x : array) {
        sum += null == x ? 0.0 : x.doubleValue();
    }
    return sum / length();
}

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2020-09-06
    相关资源
    最近更新 更多