2016-09-23 69 views
2

我有兩個for循環在下面寫java。第一個抓取網站上所有新聞報道的標題,第二個抓取同一網站上相同新文章的所有鏈接。Java - 同時執行兩個corrosponding for循環

如何使第一個循環執行一次,第二個循環執行一次,然後第一個循環執行第二次,第二個執行第二次,等等。我真的很感激你幫助,謝謝。

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

回答

4

我打算假設elements1elements2是某種Iterable<Element>,例如, List<Element>

首先,記住for (Element element : elements1)是隻是語法糖:除了你沒有訪問Iterator

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

所以,如果你想要遍歷兩個不同Iterable對象,這樣做的老式方法:

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 
} 

如果兩個Iterable對象是不一樣的長度,循環只會重複,直到較短的一個已經耗盡。另一箇中的額外元素將被忽略。

0

如果elements1elements2保證具有相同的長度,只是遍歷它們進入一個循環:

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

使用新方法processMessageRequest,使你的代碼更DRY:

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

我不確定sendMessageRequest的範圍是什麼......但是通過這種方式進行一些調整就可以工作。

+0

假設它們是數組,而不是'Collection'對象。 – Andreas

+0

非常真實。現在我想到'org.jsoup.Elements'最有可能實現一個'Collection'接口。我會+1你的答案。 –