Java:设置未知数量条目的数组长度

标签 java arrays reflection vector

我正在尝试填写 RealVector (来自 Apache Commons Math)和值。我尝试使用类(class)的 append方法,但实际上并没有添加任何东西。所以现在我正在使用 double[] ,效果很好,只是我事先不知道数组需要有多大。

private void runAnalysis() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    Double attr;
    double[] data = new double[100]; // TODO: bad.

    int i = 0;
    for (Method m : ParseTree.class.getMethods()) {
        if (m.isAnnotationPresent(Analyze.class)) {
            attr = (Double) m.invoke(this);
            analysis.put(m.getAnnotation(Analyze.class).name(), attr);
            data[i++] = attr * m.getAnnotation(Analyze.class).weight();
        }
    }

    weightedAnalysis = new ArrayRealVector(data);
}

我该如何处理这个问题?以下是我的想法:

  1. 遍历类并使用注释对方法进行计数,然后使用该大小来初始化数组。然而,这将需要一个额外的循环,并且反射是性能密集型的。 (对吗?)

  2. 为数组选择任意大小,如果空间耗尽,则将其加倍。缺点:需要更多代码行

  3. 使用List<Double> ,然后以某种方式隐藏 Double对象返回doubles这样它们就可以放在 RealVector 中。列表使用更多内存。

  4. 只需为起始数组选择一个巨大的大小,并希望它永远不会溢出。缺点:这会引发 arrayindexoutofbound 错误。

  5. 或者我只是使用 append(double d)错误的?

    private void runAnalysis() 抛出 IllegalArgumentException、IllegalAccessException、InitationTargetException { 双重属性; 加权分析 = new ArrayRealVector(data);

    for (Method m : ParseTree.class.getMethods()) {
        if (m.isAnnotationPresent(Analyze.class)) {
            attr = (Double) m.invoke(this);
            analysis.put(m.getAnnotation(Analyze.class).name(), attr);
            weightedAnalysis.append(attr * m.getAnnotation(Analyze.class).weight());
        }
    }
    

    }

最佳答案

RealVector.append() 不会修改 vector ,而是构造一个新 vector : [RealVector.append() 的 Java 文档](http://commons.apache.org/math/apidocs/org/apache/commons/math/linear/RealVector.html#append(double)) 解释:

append

RealVector append(double d)
Construct a vector by appending a double to this vector.
Parameters:
d - double to append.
Returns:
a new vector

请注意,使用RealVector构造 vector 是一项相当昂贵的操作,因为append()需要一遍又一遍地复制元素(即以您解释的方式构造数组,运行时间为 O(n^2)

我建议简单地使用java的ArrayList<Double>在构造过程中,然后简单地转换为 RealVector或您喜欢的任何其他数据抽象。

关于Java:设置未知数量条目的数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1834428/

相关文章:

java - ObjectOutput 写入损坏字节

java - Retrofit - 如何从 json 对象获取响应

javascript - 尝试访问数组: family[i] is undefined

java - 如何在 Java 中生成随机 BigInteger 值?

java - 部署 Apache Camel 应用程序时出现警告

python - 如何使用 Python C API 在已编译的 C 模块中实现 Python 数组

arrays - 如何使用jq将对象列表转换为列表对象?

C# PropertyInfo(通用)

java - 通过使用 java Field getType() 方法进行转换,将对象从一种类型转换为另一种类型

java - 将多个对象合并到 java.lang.Object 的单个实例中