4

複数のリストを反復処理する関数を作成したいと思います。これで、これらのリストのサイズがまったく同じであることがわかりました(また、タイプも異なる可能性があります)。たとえば、次のようになります。

List<Integer> list1 = getList1();
List<String> list2 = getList2();
List<Long> list3 = getList3();
list1.size() == list2.size(); // returns true
list2.size() == list3.size(); // returns true

そして、これらの各リストの同じスライスで3つの要素を受け取る関数を呼び出せるようにしたいので、たとえば次のようにします。

int calculate(int elemList1, String elemList2, long elemList3) {...}

// iterator over the lists in parallel {
    int ret = calculate(elemList1, elemList2, elemList3);
// }

ここでグアバで説明したのと同じことをしたいのですが、まだ実装されていないようです:http ://code.google.com/p/guava-libraries/issues/detail?id=677

彼らはIterators.interleaveまたはIterators.zipを行うことについて話し、私は同様のことをしたいのですが、私はできませんでした。誰かが私を少し助けてくれませんか?ありがとう!

1つのリストのサイズを取得して、インデックスで反復する必要はありません。将来、さまざまなサイズのリストを作成できるようになるため、これを行うには1つの方法のみを使用したいと思います。

4

3 に答える 3

11

複合イテレータはクールなアイデアかもしれません。例:

Iterator<Array<?>> compoundIterator = createIterator(List1, List2, List3);

次に、実装内で、リストごとにイテレーターを作成し、アイテムをループして配列に配置すると、そのようなものの消費量は次のようになります。

while (compoundIterator.hasElements()){
    Array[] elements = compountIterator.nextElement();
    calculate(elements[0], elements[1], elements[2]);
}

このソリューションの優れている点は、1つのリストが不足しているかどうかに関する詳細をすべて非表示にしていることです(もちろん、不足している場合は何をしたいかを決定する必要がありますが、それを内部にラップすることもできます)。

于 2013-01-25T01:02:52.157 に答える
1

新しいスレッドを作成し、そこでリストを繰り返すことができます。このtheradの複数をスポーンすると、リストを並行して繰り返すことができます。

任意のテンプレートタイプのListを渡したい場合は、メソッドパラメータをListとして指定するだけですが、これによりコンパイラの警告が発生する可能性があります。他に試すことができるのは、List <T extends Object>としてリストを渡し、タイプTのランタイムチェックとそれに応じたアクションを実行することです。

ただし、「並列」によってマルチスレッド/並行性を参照していない場合-代わりに、1つのループで3つのリストを反復できるようにしたい場合は、次のようになります(警告コードは大まかな例にすぎません-テストされていません/コーディング標準に準拠):

List list1 = ...
List list2 = ...
List list3 = ...

for(int i=0,j=0,k=0; i<list1.size() && j<list2.size() && k<list3.size(); ++i,++j,++k)
{
   Object elemOfList1 = list1.get(i);
   Object elemOfList2 = list2.get(j);
   Object elemOfList3 = list3.get(k);
   // do something here
}
于 2013-01-25T00:43:30.380 に答える
1

値はメソッドを呼び出すために使用されているため、実際には並行して言っているとは思いません。各リストから同じ要素が必要な場合は、異なるスレッドの異なるリストを同時にスキップしても意味がありません。

forループを実行してから、list1.get(i)、list2.get(i)、list3.get(i)を呼び出す必要があります。

于 2013-01-25T00:48:42.913 に答える