0

次の for loop ( for (int curr = 0; curr<working.size(); curr++){) ループは、n 回実行する必要があります。n は、動作中と呼ばれる ArrayList のサイズです。ただし、ArrayList に複数の要素があることを確認した後でも、ループは 1 回しか実行されません。どうしてこれなの?

 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 であるとします。最初の反復で 1 つの要素を削除すると、リストのサイズが 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 に答える