搜索阵列列表

时间:2013-06-11 14:29:24

标签: java

我目前有一个名为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循环更有效的方式搜索?

2 个答案:

答案 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可以框架有一个数组/列表)