列表将自身复制到父列表的所有元素
List copies itself to all elements of the parent list
我已经搜索了几个小时,但似乎找不到我的错误,事实上它根本没有任何意义。
我有一个 android 应用程序,它有一个 class 负责使用 XmlPullParser 解析 XML 文档。结果是一个上学日列表,其中包含有关当天的一些信息以及每天的课程列表。我能够正确提取所有这些信息,但由于某种原因,我最终每天都有相同的课程列表(尽管该元素的其他 'header' 信息仍然正确)。
完整的方法可以在这里找到(太长无法粘贴到这里):http://pastebin.com/AwxqwxQb
我这里只是post大纲:
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;
}
我真的很无助,因为这根本不应该发生。有人对此有解释吗?任何帮助表示赞赏。如果需要更多信息,请告诉我!
编辑:解析的XML可以在这里找到:http://vplankl.gymnasium-beetzendorf.de/Vertretungsplan_Klassen.xml
我期待的结果基本上是每个 table 的行数。但是,如果一行是两个句点(列名:Stunde)(例如 4-5),结果将增加一,因为我将每个 Substitution/Lesson 存储在列表的一个元素中。
最后一天的课程数是 5 - 这是复制到所有其他日子的数字。
问题是您只创建了一个 List<Substitution>
对象并不断清除它。相反,您应该为每一天创建一个全新的列表。
此外,当您将列表添加到 SubstitutionDay
时,您应该制作一份防御性副本。
我已经搜索了几个小时,但似乎找不到我的错误,事实上它根本没有任何意义。
我有一个 android 应用程序,它有一个 class 负责使用 XmlPullParser 解析 XML 文档。结果是一个上学日列表,其中包含有关当天的一些信息以及每天的课程列表。我能够正确提取所有这些信息,但由于某种原因,我最终每天都有相同的课程列表(尽管该元素的其他 'header' 信息仍然正确)。 完整的方法可以在这里找到(太长无法粘贴到这里):http://pastebin.com/AwxqwxQb
我这里只是post大纲:
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;
}
我真的很无助,因为这根本不应该发生。有人对此有解释吗?任何帮助表示赞赏。如果需要更多信息,请告诉我!
编辑:解析的XML可以在这里找到:http://vplankl.gymnasium-beetzendorf.de/Vertretungsplan_Klassen.xml
我期待的结果基本上是每个 table 的行数。但是,如果一行是两个句点(列名:Stunde)(例如 4-5),结果将增加一,因为我将每个 Substitution/Lesson 存储在列表的一个元素中。 最后一天的课程数是 5 - 这是复制到所有其他日子的数字。
问题是您只创建了一个 List<Substitution>
对象并不断清除它。相反,您应该为每一天创建一个全新的列表。
此外,当您将列表添加到 SubstitutionDay
时,您应该制作一份防御性副本。