2013-08-28 46 views
1

我有一个处理向量的函数。输入矢量的大小可以是任何达到几百万的任何值。问题是该函数只能处理不超过100k个元素的向量,没有问题。将向量分解成子向量 - Java

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

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

的是矢量仍在使用? – anubhava

+1

Vector在Java 1.2中被ArrayList取代(1998)ArrayList最多可以处理20亿个元素,所以如果遇到问题,它不是Vector或ArrayList。你将不得不说出什么问题。 –

+0

@anubhava我想这里有很多旧的例子。 – Andy

回答

1

你可能要重写你的doStuff方法采取列表,而不是一个向量参数,

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

(并注意向量<牛逼>是一个List <牛逼>)

,然后改变你的过程方法,如

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

这应该工作,只要“在放入“在运行过程方法期间,Vector不会同时更新。

如果你不能改变doStuff的签名,你可能会需要环绕子列表的结果,一个新的载体,

output.addAll(doStuff(new Vector<Stuff>(input.subList(startIdx, endIdx))))); 
2

不确定一个具有数百万个元素的Vector是否是一个好主意,但是Vector实现List,因此存在subList,它提供了Vector的一部分的轻量级(非复制)视图。尽管(因为返回的子列表不是只有一个向量,并且通常只是一个很好的习惯),您可能必须更新代码才能使用接口List,而不是仅使用特定的实现Vector。