以下for循环(for (int curr = 0; curr<working.size(); curr++){
)循环应运行n次,其中n是ArrayList的大小,称为working。但是,即使在验证ArrayList中有多个元素之后,循环也只运行一次。为什么是这样?
String sql = "SELECT time FROM `tutors`.`appointments`"
+ "WHERE tutorID = ? AND date = ?";
try{
for (int curr = 0; curr<working.size(); curr++){
System.out.println("working size: " + working.size());
System.out.println("running for the time: " + curr);
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, working.get(curr).getTutorID());
ps.setDate(2, toReturn);
ResultSet rs = ps.executeQuery();
while(rs.next()){
Time t = rs.getTime("time");
System.out.println("RS HAS : " + t);
long beforeLong = t.getTime()-900000;
long afterLong = t.getTime()+900000;
Time beforeTime = new Time(beforeLong);
Time afterTime = new Time(afterLong);
if (!time.before(beforeTime) && !time.after(afterTime)){
System.out.println("removed" + working.get(curr).getName());
working.remove(curr);
}
}
}
} catch(SQLException e) {e.printStackTrace();}
PS - 无论是将try / catch放在for循环中还是在for循环之外,我都有同样的问题。
答案 0 :(得分:3)
您在迭代时删除元素。
假设您的列表大小为2:在第一次迭代时删除一个元素,然后循环停止,因为curr
是1
,这是列表的大小。
如果删除元素,请使用迭代器迭代列表:
Iterator it = working.iterator();
while (it.hasNext()) {
...
it.remove();
}
ArrayList
迭代器对此操作是安全的。
答案 1 :(得分:1)
循环以working.size()为条件,循环内部调用的任何方法都改变了吗?我看到你在那里工作.remove(),这可能会改变循环终止条件。
尝试在循环结束时和开头打印working.size()的值。
答案 2 :(得分:0)
有可能您最终会在for
循环的第一次迭代中删除列表中的所有元素。让我们看看如何(考虑第一次迭代,curr = 0
)。
执行此语句后,rs
中可能有多条记录:
ResultSet rs = ps.executeQuery();
因此,以下while
可能会多次运行:
while(rs.next())
现在,只要此条件对任何这些记录的评估结果为真,那么
!time.before(beforeTime) && !time.after(afterTime)
索引0
上的元素(curr = 0
)已从working
中删除:
working.remove(curr);
但是通过这个删除,其他元素在列表中向左移动,这意味着另一个元素来自索引0
,它基本上成为while
循环的另一个迭代中的删除候选者。 / p>
删除此列表中指定位置的元素。转移任何 左边的后续元素(从索引中减去一个)。