2012-02-21 4 views
6

Supposons que j'ai un List<SomeObject> a. Maintenant aussi supposer que j'ai un autre List<SomeProcessor> b.
Chaque SomeProcessor utilise a pour son traitement.Java: Meilleure/élégante façon d'itérer sur 2 listes

En plus:

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

Y at-il une façon plus élégante de gérer cela?

+0

-t un support l'interface Iterable? – Wint

+0

Non. C'est juste un objet personnalisé.Comment cela aiderait-il? Je veux dire devrait-il y en avoir un? – Jim

+1

Vérifiez cette réponse: http://stackoverflow.com/a/8104205/1029272 Facile à mettre en œuvre, et fonctionne un régal. Je l'ai mis en marche dans les 5 dernières minutes pour l'essayer. – Deco

Répondre

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

Et puis une méthode d'assistance:

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

Vous pouvez mettre cette méthode d'assistance de la classe qui l'utilise, s'il n'y a qu'un seul (et le rendre private), ou mettre un utilitaire classe qui est partagée par l'ensemble du programme.

Bien sûr, il existe d'autres façons de coder processAll; Par exemple, vous pouvez utiliser une boucle for sur l'une des collections. Mais dans tous les cas, casser ce code de bas niveau en une méthode d'assistance rendra votre code de niveau plus propre et moins "bruyant". Et si vous faites quelque chose de similaire dans plusieurs parties du programme, ils peuvent partager la méthode d'assistance.

+0

Je ne veux pas pour le traiter comme ça.J'ai besoin de traiter chaque objet une fois par 1 processeur – Jim

+0

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

+0

@ narek.gevorgyan: Oui, ils sont toujours de la même taille – Jim

1

Si vous pouvez générer un Map<SomeObject, SomeProcessor> au lieu de deux listes, il sera élégant. Cela peut ne pas s'appliquer, mais je vais juste essayer.

1

Peut-être que vous pouvez essayer cette façon plus simple:

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