2012-02-21 8 views
6

List<SomeObject> aがあるとします。
また、別のList<SomeProcessor> bがあるとします。
SomeProcessorは、処理のためにaを使用します。ほかにJava:2つのリストを繰り返し処理するためのベスト/エレガントな方法

int idx = 0; 
for(SomeProcessor o:b){ 
    o2 = a.get(idx); 
    o.doSomething(o2); 
    idx++; 
} 

は、これを処理するよりエレガントな方法はありますか?

+0

がサポート反復処理可能なインタフェースしていますか? – Wint

+0

いいえ、それは単なるカスタムオブジェクトです。どのように役立つでしょうか? – Jim

+1

この答えをチェックしてください:http://stackoverflow.com/a/8104205/1029272簡単に実装し、治療を動作します。私はそれを試して最後の5分以内にそれを試して実行しています。 – Deco

答えて

7
public interface Processor<T> { 
    public void process(T object); 
} 

そしてヘルパーメソッド:

public static <T> void processAll(Collection<T> items, Collection<? extends Processor<T>> processors) { 
    Iterator<T> i = items.iterator(); 
    Iterator<? extends Processor<T>> p = processors.iterator(); 
    while(i.hasNext() && p.hasNext()) 
     p.next().process(i.next()); 
} 

が一つだけである(が、それprivate作る)場合は、それを使用するクラスにそのヘルパーメソッドを置くことができ、またはそれにユーティリティを置きますプログラム全体で共有されるクラスです。

もちろん、processAllをコードする他の方法もあります。たとえば、コレクションの1つにforループを使用できます。しかし、どのような場合でも、この低レベルのコードをヘルパーメソッドに分解すると、より高レベルのコードがより洗練され、「ノイズの少ない」ものになります。また、プログラムの複数の部分で同様のことをしている場合は、ヘルパーメソッドを共有できます。

+0

私は嫌いですそのように処理してください。1つのプロセッサで各オブジェクトを1回処理する必要があります。 – Jim

+0

b.size()== a.size()??? –

+0

@ narek.gevorgyan:はい、それらは常に同じサイズです。 – Jim

1

2つのリストの代わりにMap<SomeObject, SomeProcessor>を生成できれば、それはエレガントになります。これは当てはまらないかもしれませんが、私はちょうどそれを撃つでしょう。

1

たぶん、あなたはこの簡単な方法を試すことができます。

int idx = 0; 
while(idx<a.size() && idx<b.size()){ 
    b.get(idx).doSomething(a.get(idx++)); 
}