我目前有以下代码。我期待只为每个循环添加" 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("\\ \\;",
" ").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);
}
答案 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++;
}