Java-массив <String>, кажется, перезаписывает существующие элементы при использовании метода add () - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь прочитать строки из файла конфигурации и добавить каждую строку в ArrayList, используя метод add().

Однако, когда я иду печатать содержимое ArrayList с использованием foreach, он печатает только последний элемент, который нужно ввести. Мне кажется, что метод add () может не добавляться правильно? Я также попытался использовать универсальный для цикла вместо foreach и все тот же результат.

public static void interpret(String line){
    ArrayList<String> rooms = new ArrayList<>(); 
    ArrayList<String> rules = new ArrayList<>(); 

    // Ignore Room and Rule templates
    if(line.contains("(") && line.contains(")")){
        System.out.println("skip"); 
        return;
    }
    if(line.contains("Room;")){
        rooms.add(line);
        rooms.forEach(System.out::println);
    }
    if(line.contains("Rule;")){
        rules.add(line);
        rules.forEach(System.out::println);
    }
}

Вывод этого ниже.

Rule; (Room: SmartObject, state{condition}, state{condition}, ...)
skip
Rule; Garden: Sprinklers, on{time=15}, off{time=16}, off{weather="raining"}
Rule; Garden: Sprinklers, on{time=15}, off{time=16}, off{weather="raining"}
Rule; Kitchen: Coffee machine, on{time=6}, off{time=12}
Rule; Kitchen: Coffee machine, on{time=6}, off{time=12}

Он смешан с реальными текстовыми строками из файла, который он читает, но, как вы можете видеть, он печатает только строку над ним, которая была последней строкой, добавленной в ArrayList.

Это должно выглядеть примерно так.

Rule; (Room: SmartObject, state{condition}, state{condition}, ...)
skip
Rule; Garden: Sprinklers, on{time=15}, off{time=16}, off{weather="raining"}
Rule; Garden: Sprinklers, on{time=15}, off{time=16}, off{weather="raining"}
Rule; Kitchen: Coffee machine, on{time=6}, off{time=12}
Rule; Garden: Sprinklers, on{time=15}, off{time=16}, off{weather="raining"}
Rule; Kitchen: Coffee machine, on{time=6}, off{time=12}

Любая помощь / понимание будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Используйте следующий метод singature:

public static void interpret(List<String> rooms, List<String> rules, String line){

    // Ignore Room and Rule templates
    if(line.contains("(") && line.contains(")")){
        System.out.println("skip"); 
        return;
    }
    if(line.contains("Room;")){
        rooms.add(line);
        rooms.forEach(System.out::println);
    }
    if(line.contains("Rule;")){
        rules.add(line);
        rules.forEach(System.out::println);
    }

}

Вместо создания списков каждый раз, когда вызывается эта функция, создайте списки в функции вызывающей стороны и перейдите к этому методу.

0 голосов
/ 04 сентября 2018

Вот проблема:

ArrayList<String> rules = new ArrayList<>();

вы создаете новый ArrayList каждый раз вместо добавления к существующему

Предложение:

  1. Передайте существующий массив для вашего метода ИЛИ
  2. Объявление переменной-члена на уровне класса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...