Список копирует себя во все элементы родительского списка

Я искал часами и не могу найти свою ошибку, на самом деле это вообще не имеет никакого смысла.

У меня есть приложение для 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 - это число, которое копируется во все остальные дни.


person Crosswind    schedule 15.02.2017    source источник
comment
Я предлагаю вам использовать отладчик. Скорее всего, вы используете одну и ту же ссылку для всех списков, тогда как у вас должна быть отдельная ссылка для каждого из них.   -  person Code-Apprentice    schedule 15.02.2017
comment
Какой класс для школьных дней, а какой для уроков?   -  person Code-Apprentice    schedule 15.02.2017
comment
Это то, что я делал последние два часа .. SubstitutionDay предназначен для школьных дней и содержит список замен (уроков)   -  person Crosswind    schedule 15.02.2017
comment
Не могли бы вы привести пример xml и реального вывода? Было бы полезно, если бы вы тоже дали ожидаемый результат. Отредактируйте и добавьте это в сообщение   -  person Turkhan Badalov    schedule 15.02.2017
comment
Я отредактировал свой вопрос   -  person Crosswind    schedule 15.02.2017


Ответы (1)


Проблема в том, что вы создаете только один List<Substitution> объект и продолжаете его очищать. Вместо этого вам следует создавать новый список на каждый день.

Кроме того, вы должны сделать защитную копию при добавлении списка в SubstitutionDay.

person Code-Apprentice    schedule 15.02.2017
comment
Вместо того, чтобы очищать, это решило создание нового - что имеет смысл. Спасибо! - person Crosswind; 16.02.2017