Список копирует себя во все элементы родительского списка
Я искал часы, и я не могу найти свою ошибку, на самом деле это не имеет никакого смысла вообще.
У меня есть приложение для Android, у которого есть класс, который отвечает за анализ XML-документа с помощью XmlPullParser. Результатом является список школьных дней, который содержит некоторую информацию о дне, а также список уроков на каждый день. Я могу извлечь всю эту информацию правильно, но по какой-то причине в итоге получаю один и тот же список уроков в конце каждого дня (хотя другая информация "заголовка" этого элемента остается верной). Полный метод можно найти здесь (слишком долго, чтобы вставить его здесь): http://pastebin.com/AwxqwxQb
Я просто опубликовать план здесь:
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
Результаты, которые я ожидаю, - это в основном количество строк в каждой таблице. Однако, если одна строка для, скажем, двух периодов (имя столбца: Stunde) (например, 4-5), результат увеличивается на единицу, потому что я сохраняю каждую замену / урок в одном элементе списка. Количество уроков за последний день - 5 - это число, которое копируется во все остальные дни.
1 ответ
Проблема в том, что вы создаете только один List<Substitution>
возражать и продолжать очищать его. Вместо этого вы должны создать новый список на каждый день.
Кроме того, вы должны сделать защитную копию при добавлении списка в SubstitutionDay
,