2016-04-29 4 views
0

Das ist ein Problem, das ich bereits zu lösen weiß, aber da ich den besten Weg lernen will, werde ich hier fragen. Ich muss die beste Datenstruktur finden, um Elemente einer HTML-Tabelle zu halten, die ich von einer HTML-Seite geladen habe.Erstellen einer Karte einer HTML-Tabelle mit jsoup, welches ist die beste Datenstruktur?

Die Spalten der Tabelle sind Wochentage und die Zeilen sind Stunden pro Tag. Die Elemente der Tabelle sind nach Gruppen von Zeilen organisiert, dh nach einem Tag, das einige Tags enthält. Jeder ist eine Linie, und jedes Element innerhalb der, das sind die Linien.

Also, angesichts dieser HTML-Struktur, muss ich zuerst durch die Zeilen iterieren und dann die Elemente jeder Spalte sammeln. Da in meiner app, ich Anzeige nur der Tag, die Person will wollen, dass die Datenstruktur I war tought:

Map<String, Map<String, String>> table = new HashMap<String, Map<String, String>>(); 

Das heißt, jeder Tag ist ein Schlüssel der Karte Tabelle

und jede wichtige Punkte eine andere Karte, die die Karte der Stunden eines solchen Tages darstellt, die in der Tabelle waren, und ihre Werte. Also, für jeden Tag gibt es eine Stunde. Dies ist die Umkehrung der Tabelle: für jede Stunde gab es einen Tag, da ich das HTML-Dokument auf lineare Weise scannen musste.

Ein anderer Ansatz wäre, zuerst die Spalten zu durchlaufen (die 's), aber es ist nicht der beste Weg, weil ich wissen müsste, in welcher Zeile() sie waren. Für mich ist es besser, als die erste Art zu iterieren.

Also das Problem ist, dass ich eine Karte für jeden Tag der Woche erstellen muss, vor der Schleife, die jede Stunde durchlaufen wird (und eine andere Schleife innerhalb haben wird, die für jede Stunde die Tage durchlaufen wird)). Dies gab den folgenden Code:

Map<String, String> monday = new HashMap<String, String>(); 
    Map<String, String> thursday = new HashMap<String, String>(); 
    Map<String, String> wednesday = new HashMap<String, String>(); 
    Map<String, String> tuesday = new HashMap<String, String>(); 
    Map<String, String> friday = new HashMap<String, String>(); 
    Map<String, String> saturday = new HashMap<String, String>(); 

ich in den Code schauen und denken, dass es ein Chaos ist, so dass ich begann darüber nachzudenken, was eine bessere Art und Weise durch die Objekte einer Tabelle zu strukturieren und zu wiederholen wäre mit Jsoup.

Antwort

0

nehme an, Sie solche HTML haben:

<!DOCTYPE html> 
<html> 
<body> 

<table style="width:100%"> 
    <tr> 
    <td>Hour</td> 
    <td>Mon</td> 
    <td>Tue</td>  
    <td>Wed</td> 
    <td>Thu</td>  
    <td>Fri</td> 
    </tr> 
    <tr> 
    <td>1</td> 
    <td>aaa</td> 
    <td>bbb</td>  
    <td>ccc</td> 
    <td>ddd</td>  
    <td>eee</td> 
</tr> 
<tr> 
    <td>2</td> 
    <td>fff</td> 
    <td>ggg</td>  
    <td>hhh</td> 
    <td>iii</td>  
    <td>jjj</td> 
</tr> 
<tr> 
    <td>3</td> 
    <td>kkk</td> 
    <td>lll</td>  
    <td>mmm</td> 
    <td>nnn</td>  
    <td>ooo</td> 
</tr> 
</table> 

Sie eine Karte> Tag als Schlüssel der Karte und eine Liste der Daten für diesen Tag nutzen können. Siehe Beispiel unten

public static void main (String []args) throws IOException { 
    File input = new File("C:\\Users\\manna\\desktop\\txt.html"); //html from file or web 
    Document doc = Jsoup.parse(input,"UTF-8"); 
    Elements allTrTags = doc.select("tr"); 

    Element tableHeader = allTrTags.first(); 
    List<Element> tableData = allTrTags.subList(1, allTrTags.size()); 

    Map<String,List<String>> map = new HashMap<>(); 

    for(int i = 1; i<6; i++){ 
     List <String> tempList = new ArrayList<>(); 
     for(Element e : tableData){ 
      tempList.add(e.child(i).text());     
     } 
     map.put(tableHeader.child(i).text(), tempList); 
    } 
    System.out.println(map);  
}