假設我有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++;
}
是否有來處理這更優雅的方式?
假設我有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++;
}
是否有來處理這更優雅的方式?
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
循環。但是,無論如何,將這個低級代碼分解成一個輔助方法將使你的高級代碼更乾淨,更「吵鬧」。如果你在程序的多個部分做類似的事情,他們可以共享輔助方法。
如果您可以生成Map<SomeObject, SomeProcessor>
而不是兩個列表,那麼它會很優雅。這可能不適用,但我只是試試看。
也許你可以用這種簡單的方式嘗試:
int idx = 0;
while(idx<a.size() && idx<b.size()){
b.get(idx).doSomething(a.get(idx++));
}
不支持Iterable接口的? – Wint 2012-02-21 07:40:00
不是。它只是一個自定義的對象。如何幫助?我的意思是應該有一個? – Jim 2012-02-21 07:42:07
看看這個答案:http://stackoverflow.com/a/8104205/1029272易於實施,並工作一種享受。我在最後5分鐘內完成並運行,試用了它。 – Deco 2012-02-21 07:56:45