Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个严重的For-Each循环混淆案例_Java_Loops_Foreach - Fatal编程技术网

Java 一个严重的For-Each循环混淆案例

Java 一个严重的For-Each循环混淆案例,java,loops,foreach,Java,Loops,Foreach,我有一个程序,可以从文本文件中提取数据,并将其存储在两个不同的数组中,如下所示: public void extractDataIntoArray() { array = new ArrayList<String>(); while (s.hasNext()) { s.useDelimiter("[^0-9]+"); array.add(s.next()); } } public void extractDat

我有一个程序,可以从文本文件中提取数据,并将其存储在两个不同的数组中,如下所示:

public void extractDataIntoArray() {
    array = new ArrayList<String>();    
    while (s.hasNext()) {
        s.useDelimiter("[^0-9]+");
        array.add(s.next());
    }
  }

  public void extractDataIntoArray2() {
        array2 = new ArrayList<String>();   
        while (s.hasNext()) {
            s.useDelimiter("Event=|,(.)+[\\r\\n]*Event=|,(.)+[\\r\\n]*");
            array2.add(s.next());
        }
  }
下面是我的
createSpecificEvent()
代码的样子:

public Event createSpecificEvent(String eventName, long delayTime) {
    Event event = null;

    switch(eventName) {
    case "ThermostatNight": 
        event = new ThermostatNight(delayTime);
        break;
    case "ThermostatDay": 
        event = new ThermostatDay(delayTime);
        break;
    case "LightOn": 
        event = new LightOn(delayTime);
        break;
    case "LightOff": 
        event = new LightOff(delayTime);
        break;
    case "WaterOn":
        event = new WaterOn(delayTime);
        break;
    case "WaterOff": 
        event = new WaterOff(delayTime);
        break;
    case "Bell": 
        event = new Bell(delayTime);
        break;
    case "FansOn": 
        event = new FansOn(delayTime);
        break;
    case "FansOff": 
        event = new FansOff(delayTime);
        break;
    case "Terminate": 
        event = new Terminate(delayTime);
        break;
    }

    return event;
}
Event=ThermostatNight,time=0
Event=LightOn,time=2000
Event=WaterOff,time=10000
Event=ThermostatDay,time=12000
Event=Bell,time=9000,rings=5
Event=WaterOn,time=6000
Event=LightOff,time=4000
Event=Terminate,time=20000
Event=FansOn,time=7000
Event=WindowMalfunction,time=15000
Event=FansOff,time=8000
Restarting system
Thermostat on night setting
Light is on
Greenhouse water is off
Thermostat on day setting
Bing!
Greenhouse water is on
Light is off
Terminating
以下是我的文本文件的外观:

public Event createSpecificEvent(String eventName, long delayTime) {
    Event event = null;

    switch(eventName) {
    case "ThermostatNight": 
        event = new ThermostatNight(delayTime);
        break;
    case "ThermostatDay": 
        event = new ThermostatDay(delayTime);
        break;
    case "LightOn": 
        event = new LightOn(delayTime);
        break;
    case "LightOff": 
        event = new LightOff(delayTime);
        break;
    case "WaterOn":
        event = new WaterOn(delayTime);
        break;
    case "WaterOff": 
        event = new WaterOff(delayTime);
        break;
    case "Bell": 
        event = new Bell(delayTime);
        break;
    case "FansOn": 
        event = new FansOn(delayTime);
        break;
    case "FansOff": 
        event = new FansOff(delayTime);
        break;
    case "Terminate": 
        event = new Terminate(delayTime);
        break;
    }

    return event;
}
Event=ThermostatNight,time=0
Event=LightOn,time=2000
Event=WaterOff,time=10000
Event=ThermostatDay,time=12000
Event=Bell,time=9000,rings=5
Event=WaterOn,time=6000
Event=LightOff,time=4000
Event=Terminate,time=20000
Event=FansOn,time=7000
Event=WindowMalfunction,time=15000
Event=FansOff,time=8000
Restarting system
Thermostat on night setting
Light is on
Greenhouse water is off
Thermostat on day setting
Bing!
Greenhouse water is on
Light is off
Terminating
以下是输出结果:

public Event createSpecificEvent(String eventName, long delayTime) {
    Event event = null;

    switch(eventName) {
    case "ThermostatNight": 
        event = new ThermostatNight(delayTime);
        break;
    case "ThermostatDay": 
        event = new ThermostatDay(delayTime);
        break;
    case "LightOn": 
        event = new LightOn(delayTime);
        break;
    case "LightOff": 
        event = new LightOff(delayTime);
        break;
    case "WaterOn":
        event = new WaterOn(delayTime);
        break;
    case "WaterOff": 
        event = new WaterOff(delayTime);
        break;
    case "Bell": 
        event = new Bell(delayTime);
        break;
    case "FansOn": 
        event = new FansOn(delayTime);
        break;
    case "FansOff": 
        event = new FansOff(delayTime);
        break;
    case "Terminate": 
        event = new Terminate(delayTime);
        break;
    }

    return event;
}
Event=ThermostatNight,time=0
Event=LightOn,time=2000
Event=WaterOff,time=10000
Event=ThermostatDay,time=12000
Event=Bell,time=9000,rings=5
Event=WaterOn,time=6000
Event=LightOff,time=4000
Event=Terminate,time=20000
Event=FansOn,time=7000
Event=WindowMalfunction,time=15000
Event=FansOff,time=8000
Restarting system
Thermostat on night setting
Light is on
Greenhouse water is off
Thermostat on day setting
Bing!
Greenhouse water is on
Light is off
Terminating
第一行应立即打印,最后一行应在20秒后打印

公共作废操作(){
 public void action() {

 openFile();                     // grab file with Scanner
 extractDataIntoArray();         // extract values from text value and put in array

 openFile();                     // grab file with Scanner...
 extractDataIntoArray2();        // extract values from text file and put in array2

 for(int i = 0; i < array.size() ;i++)
 {
    long l = Long.parseLong(array.get(i)); 

    string e2 = array2.get(i);
    event = createSpecificEvent(e2, l);
    addEvent(event);

    if(e2.equals("Terminate"))
     {
       break;
     }
 }
}
openFile();//使用扫描仪获取文件 extractDataIntoArray();//从文本值中提取值并放入数组 openFile();//使用扫描仪获取文件。。。 extractDataIntoArray2();//从文本文件中提取值并放入array2 对于(int i=0;i
您在另一个循环中运行一个循环

您可能应该首先运行
extractDataIntoArray()
extractDataIntoArray2()
,然后在其中一个数组上运行循环,并在单个循环中使用这两个值,如T-D所示


您遇到的问题很可能与数据提取方法的实现有关。如果它们是从同一个文件中提取的,那么它们实际上应该是一个方法,并且您只需打开/读取该文件一次。事实上,它们似乎正在生成不同长度的数组

您是否尝试在循环中打印
l
,以便确保始终
0
?刚刚尝试过。它将0打印11次,然后转到下一个数字,即2000,并打印11次,以此类推。所以,它只是对所有事件使用0,因为我只有11个事件扫描您向我们显示您读取的文件的内容?从中提取字符串的方式可能有错误。请参阅createSpecificEventT-D的编辑:我在提取数据后打印了数组,并且它是正确的数据。我得到一个IndexOutOfBoundsException:索引11,大小:11您在问题中提到的输出大小是9而不是11,您能解释为什么吗?我不确定输出应该是什么?如果您不希望输出的大小超过9,您可以简单地将
for
循环中的条件更改为
I<9
我的输出大小将在一定范围内,因为我有几个文本文件需要从我想要的文本文件中读取,所以文件路径是我唯一需要更改的。