【问题标题】:Sum of elements of any type任何类型元素的总和
【发布时间】:2011-07-18 15:24:17
【问题描述】:
public float sum(Object ob) {
    float sum = 0;
    for (int i = 0; i < ob.length; i++) {
        sum += ob[i];
    }

    return sum;
}

如何实现一个函数来返回任何类型的所有数组元素的总和?

【问题讨论】:

  • 这是作业吗?因为我确信 JRE 中有一些东西可以为你处理一个数组的求和。
  • 你的意思是一个函数,它接受一个浮点数组,并对所有数组中的所有元素求和?
  • 你已经拥有的有什么问题?你想要什么不同的?
  • 逻辑是正确的。你在哪里被打动了?
  • 方法参数类型错误;)

标签: java


【解决方案1】:

有根据的猜测,我有一段时间没有做过 java 了。演员表是否有序?

编辑:或者,将参数类型更改为float[]

float[] ob = (float[]) ob;

public float sum(Object ob) {
    float sum = 0;
    float[] ob = (float[]) ob;
    for (int i = 0; i < ob.length; i++) {
        sum += ob[i];
    }
    return sum;

}

【讨论】:

  • 看起来很接近,但我在线程“main”java.lang.ClassCastException 中遇到异常异常:[J 无法转换为 [F
  • 没有办法根据数组的类型预先为变量 sum 声明正确的类型
  • 是的,因为该对象不可铸造为浮动。对象类型是否正确?你确定它不是数组或数组列表?
  • 那么传入的是什么类型的对象?它是某种数组吗?
【解决方案2】:

你想要做的是......基本上......实施一个糟糕的设计。 Java 中的基元数组类型不兼容,您不能以多态方式对它们进行操作。

目前尚不清楚修复设计的最佳方法是什么。但这里有几个选择:

  • 为每个有意义的情况编写一个重载方法;例如

    public int sum(int[] ints) ...
    
    public long sum(long[] longs) ...
    
    public float sum(float[] floats) ...
    

    然后确保在编译时类型已知的原始数组上调用它们。

  • 将数组包装在类中,并为每个数组实现sum 方法:

    public interface NumberArray {
        double sum();
        ...
    }
    
    public class FloatArray {
        private float[] floats;
        public Float(float[] floats) { this.floats = floats; }
        public double sum() {
            double sum = 0.0D;
            for (float f : floats) { sum += f; }
            return sum;
        }
    }
    

    等等。

实际上可以实现float sum(Object array) 方法……像这样:

public float sum(Object obj) {
    float sum = 0;
    if (obj instanceof float[]) {
        for (float f : (float[]) obj) {
            sum += f;
        }
    } else if (obj instanceof int[]) {
        for (int i : (int[]) obj) {
            sum += i;
        }
    } else if ...
    } else {
        throw new SomeException("Can't sum one of these ...");
    }
    return sum;
}

但那是非 OO 和 (IMO) 真的很难看。最好修复设计。

【讨论】:

    【解决方案3】:

    根据其他答案的评论:

    java.lang.ClassCastException: [J 不能转换为 [F

    那么它是long[],而不是float[]。只需使用long,而不是floatObject。如果你将它显式声明为方法参数,那么你也不需要摆弄强制转换。

    public long sum(long[] array) {
        long sum = 0;
        for (int i = 0; i < array.length; i++) {
            sum += array[i];
        }
        return sum;
    }
    

    另见:

    【讨论】:

    • 我应该重载方法以接受任何数组类型。但是这种方法会不必要地增加代码
    • 是的,你应该这样做。这就是使用原语的回报。然而,您不是唯一的,他们也在标准 Java SE API 中执行此操作。阅读这个优秀的主题:stackoverflow.com/questions/2337170/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2023-02-07
    • 2019-05-27
    相关资源
    最近更新 更多