2013-06-11 62 views
0

我目前有一個數組列表名列表,其中包含大量的數字(雙打)。我需要這個大陣列表分成8倍,且通過我這樣做:搜索數組列表

//Array List "list" contains close to 8 million numbers in it 
      for (int c1 = 0; c1 < list.size(); c1++) 
     { //for 
     counter1++; 
     if (counter1 % rows ==1) 
      ID.add(list.get(c1)); 
     else if (counter1 % rows ==2) 
      Contract.add(list.get(c1)); 
     else if (counter1 % rows == 3) 
      Date.add(list.get(c1)); 
     else if (counter1 % rows == 4) 
      Open.add(list.get(c1)); 
     else if (counter1 % rows == 5) 
      High.add(list.get(c1)); 
     else if (counter1 % rows == 6) 
      Low.add(list.get(c1)); 
     else if (counter1 % rows == 7) 
      Close.add(list.get(c1)); 
     else if (counter1 % rows == 8) 
      Volume.add(list.get(c1)); 
    } //for 

每8個號是重要信息的新行的開始。
例如。 ID合同日期開倉高低關閉體積 ID1合同1日期1打開1高1低1關閉1容量1

之前我問是否有更好的方法來組織這一點。我現在有一個不同的問題。有沒有一種方法可以在使用for循環之外搜索數組列表?我可以提示用戶輸入一個ID和Contract,然後讓我的程序以比使用for循環更高效的方式在代碼中搜索它,而不是象我一樣組織數組列表?

+0

您可以使用HashMap,您使用該id作爲鍵。 – Jakob

+0

你有沒有想過使用HashMap http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html –

+0

使用數據庫,可能在內存中。 – kan

回答

5

重要信息的每個「行」都應該由Java對象表示,而不是像HashMap那樣由某些人在註釋中提示。您正在使用面向對象的編程語言,因此創建一個名爲Contract(或任何其他代表這8個字段的類)的類,然後您將有一個ArrayList<Contract> = new ArrayList<Contract>(),它將存儲所有這些對象。

+1

除上述之外,如果您主要通過ID和Contract訪問它,則可以使用HashMap 來替換ArrayList ,這裏的關鍵字是ID和Contract ID的組合。 – Alan

+0

我同意Alan的觀點。還有其他有用的東西可以做,比如實現Comparable接口,這將允許您使用Collections.sort()對列表進行排序。你也可以實現比較器。有很多文章向你展示如何做這些事情,以及網絡上的差異。 – KyleM

0

由於您已經在使用數組。

分裂的過程會很長,你不能躲避。

上面提到的使用Hashmap是一個好主意,對於一個密鑰,您將擁有O(1)而不是O(n)(數組)的值。

順便說一句,你需要注意的是,每個函數(Id.add Contract.add)都可以被抽象出來,包括你想要使用的數據結構的代碼,它是一個散列表,樹,列表還是不相交集。 (如在其他答案藏漢提到)

在另一方面,加快你的分裂碼對其進行修改,以這樣的:

此代碼減小模數來評估的數量。應該更快,但可能沒有那麼多。

int selector; 
for (int c1 = 0; c1 < list.size(); c1++) 
{ 
    counter1++; 
    selector = counter1 = % rows; 
    switch(selector) 
    { 
     case 1: 
      ID.add(list.get(c1)); 
      break; 
     case 2: 
      Contract.add(list.get(c1)); 
      break; 
     case 3: 
      Date.add(list.get(c1)); 
      break; 
     case 4: 
      Open.add(list.get(c1)); 
      break; 
     case 5: 
      High.add(list.get(c1)); 
      break; 
     case 6: 
      Low.add(list.get(c1)); 
      break; 
     case 7: 
      Close.add(list.get(c1)); 
      break; 
     case 8: 
      Volume.add(list.get(c1)); 
      break; 
    } 
} 

這是考慮我從列表內容中瞭解的更快的方法。 沒有評估(如果/切換/模),只有吸氣劑,更少的迭代,沒有計數器。

//The list is made of block of 8 units, lets read block by block and not node by node 
for (int c1 = 0; c1 < list.size()/8; c1++) 
{ 
    ID.add(list.get(c1*8 + 1)); 
    Contract.add(list.get(c1*8 + 2)); 
    Date.add(list.get(c1*8 + 3)); 
    Open.add(list.get(c1*8 + 4)); 
    High.add(list.get(c1*8 + 5)); 
    Low.add(list.get(c1*8 + 6); 
    Close.add(list.get(c1*8 + 7)); 
    Volume.add(list.get(c1*8 + 8)); 
}  

ON在數組中搜索for循環。

99%的時間,如果有一個像list.find()這樣的函數,它將成爲for循環trew每個節點。唯一不適用的情況是數據結構由語言構成,而不是列表。 (哈希映射可能被綁定了一個數組/列表)

+0

請告訴我,如果確實有幫助,我可能會理解錯誤的結構。 – Fawar