将向量拆分为子向量 - Java

时间:2013-08-28 09:20:04

标签: java

我有一个处理矢量的函数。输入向量的大小可以是几百万。问题是函数只能处理不大于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;
}

我该怎么做?

2 个答案:

答案 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)))));