2012-02-21 15 views
6

Załóżmy, że mam List<SomeObject> a.
Teraz również przyjmijmy, że mam inny List<SomeProcessor> b.
Każdy kod SomeProcessor wykorzystuje do przetwarzania.Java: Najlepszy/elegancki sposób na iterację na 2 listach

Poza tym:

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

Czy jest bardziej elegancki sposób, aby sobie z tym poradzić?

+0

robi pomocy interfejsu Iterable? – Wint

+0

Nie. To tylko obiekt niestandardowy. Jak by to mogło pomóc? Mam na myśli, czy powinien być jeden? – Jim

+1

Sprawdź tę odpowiedź: http://stackoverflow.com/a/8104205/1029272 Łatwy do wdrożenia i działa na leczeniu. Dostałem go i uruchomiłem w ciągu ostatnich 5 minut, żeby go wypróbować. – Deco

Odpowiedz

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

I wtedy metoda pomocnika:

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

Można umieścić tę metodę pomocnika na klasy, która go używa, jeśli istnieje tylko jeden (i uczynić go private), lub umieścić go narzędzia klasa dzielona przez cały program.

Oczywiście istnieją inne sposoby kodowania processAll; na przykład można użyć pętli for w jednej z kolekcji. Ale w każdym razie, złamanie tego kodu niskiego poziomu w metodę pomocnika spowoduje, że twój kod wyższego poziomu będzie czystszy i mniej "hałaśliwy". A jeśli robisz coś podobnego w wielu częściach programu, mogą udostępniać metodę pomocnika.

+0

Nie chcę przetwarzać go w ten sposób. Muszę przetworzyć każdy obiekt raz przez 1 procesor – Jim

+0

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

+0

@ narek.gevorgyan: Tak, zawsze są one tego samego rozmiaru. – Jim

1

Jeśli możesz wygenerować Map<SomeObject, SomeProcessor> zamiast dwóch list, to będzie elegancka. To może nie mieć zastosowania, ale zrobię to po prostu.

1

Może spróbować z tym prostszy sposób:

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