2013-08-28 45 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。