2017-02-15 5 views
1

Ich habe Stunden gesucht und ich kann nicht meinen Fehler finden, in der Tat macht es überhaupt keinen Sinn.Liste kopiert sich selbst in alle Elemente der Elternliste

Ich habe eine Android-App, die eine Klasse hat, die für die Analyse eines XML-Dokuments mit dem XmlPullParser verantwortlich ist. Das Ergebnis ist eine Liste von Schultagen, die Informationen über den Tag und eine Liste von Lektionen für jeden Tag enthalten. Ich bin in der Lage, alle diese Informationen korrekt zu extrahieren, aber aus irgendeinem Grund habe ich am Ende die gleiche Liste von Lektionen für jeden Tag (die anderen 'Kopfzeilen' Informationen dieses Elements bleiben jedoch korrekt). Complete-Methode finden Sie hier (zu lange es hier einfügen): http://pastebin.com/AwxqwxQb

poste ich nur die Umrisse hier:

List<SubstitutionDay> parseReturnSubstitution() { 
    SubstitutionDay currentSubstitutionDay = new SubstitutionDay(); 
    List<SubstitutionDay> results = new ArrayList<>(); 
    Substitution currentSubstitution = new Substitution(); 
    List<Substitution> currentSubstitutionList = new ArrayList<>(); 
    int multipleClasses = 0, multiplePeriods = 0; 
    String text = ""; 

    try { 
     // all the XmlPullParser set up 

     int eventType = xmlPullParser.getEventType(); 

     while (eventType != END_DOCUMENT) { 
      String tag; 
      String[] tempStringArray; 

      tag = xmlPullParser.getName(); 
      switch (eventType) { 
       case TEXT: 
        text = xmlPullParser.getText(); 
        break; 

       case START_TAG: 
        switch (tag) { 
         case "kopf": 
          // reset the school day 
          currentSubstitutionDay = new SubstitutionDay(); 
          break; 
         case "haupt": 
          // empty the list before new elements are added 
          currentSubstitutionList.clear(); 
          break; 
         case "aktion": 
          // reset values for each new substitution 
          currentSubstitution = new Substitution(); 
          multipleClasses = 0; 
          multiplePeriods = 0; 
          break; 
        } 
        break; 

       case END_TAG: 
        switch (tag) { 
         // iterate over xml elements that contain header information about the day 

         // iterate over the individual lessons 
         case "klasse": 

          break; 
         case "stunde": 

          break; 
         case "lehrer": 

          break; 
         case "raum": 

          break; 
         case "info": 

          break; 

         case "aktion": 

          break; 

         case "haupt": 
          // add the list of lessons to the day 
          // the number of lessons is correct here 
          currentSubstitutionDay.setSubstitutionList(currentSubstitutionList); 
          // add the whole day to the result set 
          // number of lessons is still correct 
          results.add(currentSubstitutionDay); 

          break; 
        } 
        break; 
      } 
      eventType = xmlPullParser.next(); 
     } 
    } // catch statements follow here 

    // when I check for the size of results.get(i).getSubstitutionList().size() the size is the same for all elements 
    return results; 
} 

ich hier wirklich hilflos bin, da dies überhaupt nicht passiert sollte . Hat jemand eine Erklärung dafür? Jede Hilfe wird geschätzt. Wenn weitere Informationen benötigt werden, lassen Sie es mich wissen!

Edit: Das XML, das analysiert wird, finden Sie hier: http://vplankl.gymnasium-beetzendorf.de/Vertretungsplan_Klassen.xml

Die Ergebnisse erwarte ich sind im Grunde die Anzahl der Zeilen aus jeder Tabelle. Wenn eine Zeile jedoch für zwei Perioden (Spaltenname: Stunde) (zB 4-5) steht, wird das Ergebnis um eins erhöht, weil ich jede Ersetzung/Lektion in einem Element der Liste abspeichere. Die Anzahl der Stunden für den letzten Tag ist 5 - das ist die Nummer, die an alle anderen Tage kopiert wird.

+0

Ich schlage vor, dass Sie einen Debugger verwenden. Höchstwahrscheinlich verwenden Sie für alle Listen dieselbe Referenz, wenn Sie für jede eine separate Referenz haben sollten. –

+0

Welche Klasse ist für "Schultage" und welche für "Unterricht"? –

+0

Das war, was ich in den letzten zwei Stunden gemacht habe. SubstitutionDay ist für die Schulzeit und hält eine Liste von Substitution (Lektionen) – Crosswind

Antwort

1

Das Problem ist, dass Sie nur ein List<Substitution> Objekt erstellen und es immer wieder löschen. Stattdessen sollten Sie eine brandneue Liste für jeden Tag erstellen.

Darüber hinaus sollten Sie eine defensive Kopie erstellen, wenn Sie die Liste zu einer SubstitutionDay hinzufügen.

+0

Anstatt zu klären, erstellt eine neue Lösung - was sinnvoll ist. Vielen Dank! – Crosswind

Verwandte Themen