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
我的输出大小将在一定范围内,因为我有几个文本文件需要从我想要的文本文件中读取,所以文件路径是我唯一需要更改的。