2016-09-23 1 views
2

J'ai deux boucles for écrites en Java ci-dessous. Le premier saisit tous les titres des articles de nouvelles sur un site Web, et le second saisit tous les liens des mêmes nouveaux articles sur le même site Web.Java - Exécution de deux boucles corrospondant en même temps

Comment faire en sorte que lorsque la première boucle s'exécute une fois, la deuxième boucle s'exécute une fois, puis la première boucle exécute une deuxième fois, et la seconde exécute une seconde fois, etc. J'apprécierais vraiment votre aide, merci.

for(org.jsoup.nodes.Element element : elements1){ 

    sendMessageRequest.setText(element.text()); 


    sendMessage(sendMessageRequest); 
    System.out.print("sent message"); 
} 

for(org.jsoup.nodes.Element element : elements2) { 

    sendMessageRequest.setText(element.text()); 


    sendMessage(sendMessageRequest); 
    System.out.print("sent message"); 
} 

Répondre

4

Je vais supposer que elements1 et elements2 sont une sorte de Iterable<Element>, par exemple. List<Element>.

D'abord, rappelez-vous que for (Element element : elements1) est juste du sucre syntaxique pour:

Iterator<Element> iter = elements1.iterator(); 
while (iter.hasNext()) { 
    Element element = iter.next(); 
    // code here 
} 

Sauf que vous n'avez pas accès à l'Iterator.

Donc, si vous voulez itérer deux objets Iterable différents, faire le chemin à l'ancienne:

Iterator<Element> iter1 = elements1.iterator(); 
Iterator<Element> iter2 = elements2.iterator(); 
while (iter1.hasNext() && iter2.hasNext()) { 
    Element element1 = iter1.next(); 
    Element element2 = iter2.next(); 
    // code here 
} 

Si les deux objets Iterable ne sont pas la même longueur, la boucle n'itérer jusqu'à ce que la plus court a été épuisé. Les éléments supplémentaires dans l'autre seront simplement ignorés.

0

Si elements1 et elements2 sont garantis d'avoir la même longueur, juste itérer à travers eux dans une boucle:

for (int i = 0; i < elements1.length; i++) { 
    processMessageRequest(elements1[i]); 
    processMessageRequest(elements2[i]); 
} 

En utilisant une nouvelle méthode processMessageRequest pour rendre votre code plus DRY:

private void processMessageRequest(Element e) { 
    sendMessageRequest.setText(e.text()); 
    sendMessage(sendMessageRequest); 
    System.out.println("sent message"); 
} 

Je ne suis pas sûr de ce que la portée de sendMessageRequest est ... mais avec quelques réglages de cette façon pourrait fonctionner.

+0

En supposant qu'ils soient des tableaux, pas des objets 'Collection'. – Andreas

+0

Très vrai. Maintenant que j'y pense, 'org.jsoup.Elements' implémente probablement une interface' Collection'. Je vais +1 votre réponse. –