2013-03-16 5 views
0

Цикл цикла (for (int curr = 0; curr<working.size(); curr++){) должен выполняться n раз, где n - это размер вызываемого 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 или вне его.

+0

Что вы видите при прохождении кода в своем отладчике? –

ответ

3

Вы удаляете элементы во время итерации.

Предположим, что ваш список имеет размер 2: сначала итерация вы удаляете один элемент, а затем цикл останавливается, потому что curr - это 1 который является размером списка.

Используйте итератор для перебора списка, если вы удалите элементы:

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

ArrayList итератора является безопасным для этой операции.

1

Петля обусловлена ​​работой.size(), может ли любой из методов, вызванных внутри цикла, изменить это? Я вижу, что у вас есть work.remove(), что может изменить условие завершения цикла.

Попробуйте напечатать значение work.size() в конце цикла, а также в начале.

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.

ArrayList.remove:

Удаляет элемент в указанной позиции в этом списке. Сдвигает любые последующие элементы слева (вычитает один из их индексов).

Смежные вопросы