2013-06-11 63 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