0

我目前有一个名为 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 合约 1 日期 1 开盘 1 高 1 低 1 收盘 1 成交​​量 1

在我问是否有更好的方法来组织这个之前。我现在有一个不同的问题。有没有办法在使用 for 循环之外搜索数组列表?我可以提示用户输入 ID 和合同,然后让我的程序以比使用 for 循环更有效的方式在代码中搜索它,而不是像我那样组织数组列表(它需要永远处理大型文档) ?

4

2 回答 2

5

重要信息的每一“行”都应该由 Java 对象表示,而不是像某些人在评论中建议的那样由 HashMap 表示。您正在使用面向对象的编程语言,因此创建一个名为Contract(或任何其他代表这 8 个字段的类),然后您将拥有一个ArrayList<Contract> = new ArrayList<Contract>()存储所有这些对象的类。

于 2013-06-11T14:41:50.433 回答
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;
    }
}

考虑到我从列表内容中理解的内容,这是一种更快的方法。没有评估(if/switch/modulo),只有吸气剂,更少的迭代,没有计数器。

//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 循环遍历每个节点。唯一不正确的情况是数据结构由语言制成而不是列表。(Hashmap可以被框起来有一个数组/列表)

于 2013-06-11T14:53:14.013 回答