2012-02-21 14 views
6

Si supponga di avere un List<SomeObject> a.
Supponiamo ora di avere un altro List<SomeProcessor> b.
Ogni SomeProcessor utilizza a per l'elaborazione.Java: metodo migliore/elegante per iterare su 2 elenchi

Inoltre:

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

C'è un modo più elegante per gestire questa situazione?

+0

fa un'interfaccia Iterable supporto? – Wint

+0

No. È solo un oggetto personalizzato. Quanto sarebbe utile? Voglio dire che ce ne dovrebbe essere uno? – Jim

+1

Dai un'occhiata a questa risposta: http://stackoverflow.com/a/8104205/1029272 Facile da implementare e funziona a meraviglia. L'ho installato e funzionante negli ultimi 5 minuti per provarlo. – Deco

risposta

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

E poi un metodo di supporto:

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

Si potrebbe mettere che metodo di supporto alla classe che lo utilizza, se v'è una sola (e renderlo private), o mettere un programma di utilità classe che è condivisa da tutto il programma.

Ovviamente ci sono altri modi per codificare processAll; ad esempio, è possibile utilizzare un ciclo for in una delle raccolte. In ogni caso, suddividere questo codice di basso livello in un metodo di supporto renderà il tuo codice di livello superiore più pulito e meno "rumoroso". E se stai facendo qualcosa di simile in più parti del programma, possono condividere il metodo di supporto.

+0

Non voglio elaborarlo in questo modo. Devo elaborare ogni oggetto una volta per 1 processore. – Jim

+0

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

+0

@ narek.gevorgyan: Sì, hanno sempre la stessa dimensione – Jim

1

Se è possibile generare uno Map<SomeObject, SomeProcessor> anziché due elenchi, sarà elegante. Questo potrebbe non essere valido, ma mi limiterò a farlo.

1

Forse si può provare con questo modo più semplice:

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