使用add()方法时,java arraylist <string>似乎会覆盖现有项目

时间:2018-09-04 04:06:54

标签: java arraylist foreach

我正在尝试从配置文件中读取行,并使用ArrayList方法将每一行附加到add()中。

但是,当我打算通过使用ArrayList打印foreach的内容时,它仅打印要输入的最后一项。在我看来,add()方法可能未正确附加?我还尝试使用泛型for循环而不是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 :(得分:1)

这是问题所在:

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

您每次都创建一个新的ArrayList,而不是添加到现有的ArrayList中

建议:

  1. 将现有数组列表传递给您的方法,或者
  2. 在类级别声明成员变量

答案 1 :(得分:0)

使用以下方法:

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);
    }

}

与其在每次调用此函数时都创建列表,不如在调用方函数中创建列表并传递给此方法。