1

我有一个处理向量的函数。输入向量的大小可以是几百万。问题是该函数只能处理不超过 100k 个元素的向量而不会出现问题。

如果向量的元素太多,我想在较小的部分中调用函数

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;
}

我该怎么做?

4

2 回答 2

2

不确定具有数百万个元素的 Vector 是否是一个好主意,但 Vector 实现了 List,因此subList它提供了 Vector 一部分的轻量级(非复制)视图。

不过,您可能必须更新您的代码才能使用接口 List 而不是仅使用特定的实现 Vector(因为返回的子列表不是 Vector,这通常是一种很好的做法)。

于 2013-08-28T09:28:17.463 回答
1

您可能想重写您的 doStuff 方法以采用 List 而不是 Vector 参数,

public Collection<Output> doStuff(List<Stuff> v) { 
  // calculation
}

(注意 Vector<T> 是 List<T>)

然后将您的处理方法更改为类似

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;
  }
}

只要在运行过程方法期间没有同时更新“输入”向量,这应该可以工作。

如果你不能改变 doStuff 的签名,你可能需要在 subList 的结果周围包裹一个新的 Vector,

output.addAll(doStuff(new Vector<Stuff>(input.subList(startIdx, endIdx)))));
于 2013-08-28T09:37:46.177 回答