0

下面的 for 循环 ( for (int curr = 0; curr<working.size(); curr++){) 循环应该运行 n 次,其中 n 是称为 working 的 ArrayList 的大小。但是,即使在验证 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 循环内部还是外部,我都有同样的问题。

4

3 回答 3

3

您在迭代时删除元素。

假设您的列表大小为 2 :在第一次迭代中,您删除了一个元素,然后循环停止,因为这curr1列表的大小。

如果删除元素,请使用迭代器迭代列表:

Iterator it = working.iterator();
while (it.hasNext()) {
    ...
    it.remove();
}

ArrayList迭代器对于此操作是安全的。

于 2013-03-16T08:36:59.330 回答
1

循环以working.size()为条件,循环内调用的任何方法都会改变这个吗?我看到你在那里有 working.remove() ,这可能会改变循环终止条件。

尝试在循环结束和开始时打印 working.size() 的值。

于 2013-03-16T08:36:23.890 回答
0

您有可能最终在for循环的第一次迭代中删除列表中的所有元素。让我们看看如何(考虑第一次迭代,curr = 0)。

rs此语句执行后可能有多条记录:

ResultSet rs = ps.executeQuery();

因此,以下while可能最终会运行多次:

while(rs.next())

现在,只要对于任何这些记录,此条件评估为 true:

!time.before(beforeTime) && !time.after(afterTime)

索引0(as curr = 0) 处的元素从 中删除working

working.remove(curr);

但是随着这个删除,其他元素在列表中向左移动,这意味着另一个元素来自 index 0,它本质上成为while循环的另一个迭代中删除的候选者。

ArrayList.remove

移除此列表中指定位置的元素。将任何后续元素向左移动(从它们的索引中减去 1)。

于 2013-03-16T09:38:16.057 回答