2014-11-03 5 views
0

В настоящее время у меня есть код ниже. Я ищу только первые 10 итераций для каждого цикла, который добавляет «DogDetail» в TableView вместо количества записей, которые могут быть извлечены из веб-страницы.Сделайте первые 10 итераций для каждого цикла - java

Например: если «Собака» имеет 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); 
} 
+0

Каким образом ваша программа еще не в состоянии выполнить это? – APerson

+2

используйте целочисленный счетчик и перерыв, когда он достигает 10. – Kakarot

+0

Привет. Я не уверен, где поставить счетчик? На данный момент я, кажется, просто распечатываю ту же запись 10 раз, а не первые 10 записей ... –

ответ

3

чуть выше для каждого цикла, сделайте Kakarot говорит и инициализировать целочисленный счетчик:

int forCounter = 0; 

внутри вашего для каждого цикла, приращение счетчика (вероятно, в качестве последней строки цикла, хотя технически это не имеет значения, где ты делаешь это).

forCounter++; 

Тогда, как первая строка для каждого цикла, проверьте, является ли ваш счетчик достиг максимальных повторения, которые вы хотите, и если да сломается.

if (forCounter >= maxIterations) break; 

Просто FYI, это своего рода упражнение, почему использование для цикла может быть лучше, чем использовать для каждого цикла, как вы сделали.

+0

Perfect. Это именно то, что я искал. Думаю, мне нужно сделать еще несколько исследований в циклах и перерывах! Еще раз спасибо. –

+0

'List # subList' - это метод, специально предоставленный * not *, для которого требуется достижение равных для цикла или хаков, таких как счетчик и' break'. –

3

Вы разместили много кода, не связанный с вашим актуальным вопросом, но он по-прежнему отсутствует существенная часть: тип возвращаемого 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

Используйте переменную управления либо как часть для цикла или в качестве переменной вне для цикла:

// 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++; 
} 
Смежные вопросы