我目前有一个名为list的数组列表,其中包含大量数字(双精度数)。我需要将这个大数组列表分成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 Contract1 Date1 Open1 High1 Low1 Close1 Volume1
之前我问过是否有更好的方法来组织这个。我现在有一个不同的问题。有没有办法在使用for循环之外搜索arraylist?而不是像我一样组织数组列表(它需要永远使用大型文档),我可以提示用户输入ID和契约,然后让我的程序在代码中以比使用for循环更有效的方式搜索?
答案 0 :(得分:5)
重要信息的每个“行”应该由Java对象表示,而不是由某些人在评论中建议的HashMap表示。您正在使用面向对象的编程语言,因此创建一个名为Contract
的类(或其他代表这8个字段的类),然后您将拥有一个ArrayList<Contract> = new ArrayList<Contract>()
来存储所有这些对象。
答案 1 :(得分:0)
因为你已经在使用数组了。
分裂的过程会很长,你无法回避。
上面提到使用Hashmap是个好主意,对于一个键,你将得到O(1)而不是O(n)(数组)的值。
BTW你需要注意每个函数(Id.add Contract.add)都可以被抽象出来并包含你想要使用的数据结构的代码,它是一个hashmap,tree,list还是disjoint set。 (在另一个答案中也提到了)
另一方面,要加快拆分代码,请将其修改为:
此代码减少要评估的模数。应该更快但可能没那么多。
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;
}
}
考虑到我从列表内容中理解的内容,这是一种更快捷的方式。 没有评估(如果/ switch / modulo),只有getter,更少的迭代,没有计数器。
//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每个节点。唯一不恰当的情况是数据结构是由语言制成的,而不是列表。 (Hashmap可以框架有一个数组/列表)