为每个循环做前10次迭代 - java

时间:2014-11-03 19:22:42

标签: java foreach jsoup

我目前有以下代码。我期待只为每个循环添加" DogDetail"的前10次迭代。到TableView而不是可能从网页中提取的记录数量。

例如:如果是" Dog"有50条历史记录,我只想"得到"其中10个,减慢了运行程序的时间。

public void loadHistory() throws IOException{
    //races = new ArrayList<Race>();

    Dog dog = (Dog)tblRunners.getSelectionModel().getSelectedItem();
    String selectedDog = dog.getName();
    lblRunner.setText(selectedDog);

    //getHistory
    String dogPage = "http://www.gbgb.org.uk/raceCard.aspx?dogName=" + selectedDog;
    Document doc1 = Jsoup.connect(dogPage).get();

    Element tblHeader = doc1.select("table.MasterTable_Web20 tbody").first();
    List<DogDetail> data = new ArrayList<>();
    for (Element element1 : tblHeader.children()){
        DogDetail dogDetail = new DogDetail();
        dogDetail.setDate(element1.select("td:eq(0)").text());
        // System.out.println((element1.select("td:eq(0)").text()));
        dogDetail.setDistance(element1.select("td:eq(2)").text());
        dogDetail.setFin(element1.select("td:eq(4)").text());
        dogDetail.setTrack(element1.select("td:eq(7)").text());
        String raceURLlong1 = (element1.select("td:eq(14)").html());
        String raceURLlong2 = raceURLlong1.replace("<a href=\"","");
        String raceURL = "http://www.gbgb.org.uk/" + raceURLlong2.replace("\">View Race</a>","");
        data.add(dogDetail);

        Document document = Jsoup.connect(raceURL).get(); 
        XElements element = Xsoup.compile("//*[@id=\"content\"]/table[2]/tbody/tr[2]/td/table/tbody/tr/td[2]/table[1]/tbody/tr/td[4]").evaluate(document);

        // Get text content
        String textContent = element.getElements().get(0).childNode(0).toString();

        // Extract time portion
        String time = textContent.trim().replaceAll("\\&nbsp\\;",
                " ").split("\\s+")[1];
        dogDetail.setTime(time);
    }

    // TableView<DogDetail> tblHistory = new TableView<DogDetail>(FXCollections.observableArrayList(data));
    // tblHistory.setItems();
    ObservableList<DogDetail> tmp2 = FXCollections.observableArrayList(data);
    tblHistory.setItems(tmp2);
}

3 个答案:

答案 0 :(得分:4)

您发布了许多与您的实际问题无关的代码,但它仍然缺少必要的部分:tblHeader.children()的返回类型。我将假设它是List。在这种情况下,您应该替换以下内容:

for (Element element1 : tblHeader.children()) {

List<Element> children = tblHeader.children();
for (Element element1 : children.subList(0, Math.min(10, children.size())) {

答案 1 :(得分:3)

在每个循环的正上方,按照Kakarot所说并初始化整数计数器:

int forCounter = 0;

在每个循环的内部,递增此计数器(可能是循环的最后一行,尽管从技术上讲,它与您执行此操作的位置无关)。

forCounter++;

然后,作为每个循环的第一行,检查您的计数器是否已达到所需的最大迭代次数,如果是,则中断。

if (forCounter >= maxIterations) break;

仅供参考,这是一种练习,为什么使用for循环可能比为每个循环使用a更好。

答案 2 :(得分:1)

使用控制变量作为for循环的一部分或作为for循环之外的变量:

// Make sure to account for cases where there are less than 10 children
for ( int i = 0; i < 10 || i == tblHeader.getChildren().size(); i++ ) {
    Element element = tblHeader.getChildren().get(i);
    [...]
}

int i = 0;
for ( Element element1 : tblHeader.getChildren() ) {
    if ( i >= 10 || i == tblHeader.getChildren().size()) break;
    [...]
    i++;
}