我有一个处理矢量的函数。输入向量的大小可以是几百万。问题是函数只能处理不大于100k元素的向量而没有问题。
如果vector有太多的元素,我想在较小的部分调用函数
Vector<Stuff> process(Vector<Stuff> input) {
Vector<Stuff> output;
while(1) {
if(input.size() > 50000) {
output.addAll(doStuff(input.pop_front_50k_first_ones_as_subvector());
}
else {
output.addAll(doStuff(input));
break;
}
}
return output;
}
我该怎么做?
答案 0 :(得分:2)
不确定具有数百万个元素的Vector是否是一个好主意,但Vector实现了List,因此subList
提供了Vector部分的轻量级(非副本)视图。
您可能必须更新代码才能使用接口List而不是仅使用特定的实现Vector(因为返回的子列表不是Vector,一般来说这只是一个好习惯)。
答案 1 :(得分:1)
您可能想要重写doStuff方法以获取List而不是Vector参数
public Collection<Output> doStuff(List<Stuff> v) {
// calculation
}
(并注意Vector&lt; T&gt;是List&lt; T&gt;)
然后将您的流程方法更改为
Vector<Stuff> process(Vector<Stuff> input) {
Vector<Stuff> output;
int startIdx = 0;
while(startIdx < input.size()) {
int endIdx = Math.min(startIdx + 50000, input.size());
output.addAll(doStuff(input.subList(startIdx, endIdx)));
startIdx = endIdx;
}
}
只要在运行过程方法期间没有同时更新“input”Vector,这就应该可以工作。
如果你不能改变doStuff的签名,你可能需要围绕subList的结果包装一个新的Vector,
output.addAll(doStuff(new Vector<Stuff>(input.subList(startIdx, endIdx)))));