0

現在、多くの数値 (double) を含む 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

一部の人々がコメントで提案したように、重要な情報の各「行」は HashMap ではなく、Java オブジェクトで表す必要があります。オブジェクト指向プログラミング言語を使用しているので、 という名前のクラスContract(またはこれらの 8 つのフィールドを表すもの) を作成するとArrayList<Contract> = new ArrayList<Contract>()、それらのオブジェクトをすべて格納する が作成されます。

于 2013-06-11T14:41:50.433 に答える
0

すでに配列を使用しているため。

分割のプロセスは長くなり、それをかわすことはできません。

上記の Hashmap を使用することは、O(n) (配列) ではなく O(1) に値を持つキーの良い考えです。

ところで、すべての関数 ( 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)、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 になります。そうでない唯一のケースは、言語によってデータ構造がリストにならないように作成されている場合です。(ハッシュマップは配列/リストを持って組み立てることができます)

于 2013-06-11T14:53:14.013 に答える