我试图用值填充RealVector(来自Apache Commons Math)。我尝试使用该类的append
方法,但实际上并没有增加任何内容。所以现在我使用的是double[]
,它工作正常,但事先并不知道阵列需要多大。Java:为未知数量的条目设置数组长度
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);
}
我该如何处理这个问题?这里是我的想法:
迭代通过类和计数用注释的方法,然后使用该大小来初始化数组。但是,这将需要一个额外的循环,反射是性能密集型的。 (对吧?)
为数组选择一个任意大小,如果空间用完,就加倍。缺点:需要更多的代码
使用
List<Double>
,然后以某种方式逃避责任的Double
对象放回doubles
因此它们可以被放在RealVector
。为列表使用更多的内存。只需为起始数组选择一个巨大的大小,并希望它永远不会溢出。缺点:这是乞求arrayindexoutofbound错误。
还是我刚使用
append(double d)
错了?private void runAnalysis()抛出IllegalArgumentException,IllegalAccessException,InvocationTargetException双重attr; weightedAnalysis = 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()); } }
}
为什么不读书的问题消息,而不是唯一的问题是主体? – BalusC 2009-12-02 17:29:00
他提到使用列表会吃内存。不是解决方案。 – 2009-12-02 17:29:56