2012-02-21 11 views
6

Supongamos que tengo List<SomeObject> a.
Ahora también asumo que tengo otro List<SomeProcessor> b.
Cada SomeProcessor usa a para su procesamiento.Java: mejor/elegante forma de iterar en 2 listas

Además:

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

¿Existe una manera más elegante de manejar esto?

+0

hace una interfaz Iterable apoyo? – Wint

+0

No. Es solo un objeto personalizado. ¿Cómo sería esa ayuda? Quiero decir, ¿debería haber una? – Jim

+1

Echa un vistazo a esta respuesta: http://stackoverflow.com/a/8104205/1029272 Fácil de implementar, y funciona como un regalo. Lo puse en funcionamiento en los últimos 5 minutos para probarlo. – Deco

Respuesta

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

Y entonces un método de ayuda:

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()); 
} 

Usted puede poner ese método de ayuda en la clase que lo utiliza, si sólo hay uno (y que sea private), o ponerlo una utilidad clase que es compartida por todo el programa.

Por supuesto, hay otras maneras de codificar processAll; por ejemplo, puede usar un bucle for en una de las colecciones. Pero en cualquier caso, dividir este código de bajo nivel en un método de ayuda hará que su código de nivel superior sea más limpio y menos "ruidoso". Y si está haciendo algo similar en varias partes del programa, puede compartir el método de ayuda.

+0

No quiero para procesarlo así. Necesito procesar cada objeto una vez por 1 procesador – Jim

+0

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

+0

@ narek.gevorgyan: Sí, siempre son del mismo tamaño – Jim

1

Si puede generar un Map<SomeObject, SomeProcessor> en lugar de dos listas, entonces será elegante. Esto puede no ser aplicable, pero solo voy a intentarlo.

1

Tal vez se puede tratar con esta forma más simple:

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