2012-02-21 99 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

不支持Iterable接口的? – Wint 2012-02-21 07:40:00

+0

不是。它只是一個自定義的對象。如何幫助?我的意思是應該有一個? – Jim 2012-02-21 07:42:07

+1

看看這個答案:http://stackoverflow.com/a/8104205/1029272易於實施,並工作一種享受。我在最後5分鐘內完成並運行,試用了它。 – Deco 2012-02-21 07:56:45

回答

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;例如,您可以在其中一個集合上使用for循環。但是,無論如何,將這個低級代碼分解成一個輔助方法將使你的高級代碼更乾淨,更「吵鬧」。如果你在程序的多個部分做類似的事情,他們可以共享輔助方法。

+0

我不想要以這種方式處理它。我需要通過1個處理器處理每個對象 – Jim 2012-02-21 07:35:53

+0

b.size()== a.size()??? – 2012-02-21 07:40:53

+0

@ narek.gevorgyan:是的,它們總是相同的尺寸 – Jim 2012-02-21 07:41:46

1

如果您可以生成Map<SomeObject, SomeProcessor>而不是兩個列表,那麼它會很優雅。這可能不適用,但我只是試試看。

1

也許你可以用這種簡單的方式嘗試:

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