2015-03-07 2 views
0

У меня есть 5 rectObj, но цикл продолжается только дважды.Java, не повторяющий весь путь через массив

Вот мой код:

public boolean bottomLeft() { 
    boolean ret = false; 
    Iterator<rectObj> rectItr = Main.rectAr.iterator(); 
    while (rectItr.hasNext() && ret == false) { 
     rectObj e = rectItr.next(); 
     if (x > e.getX() && x < e.getX()+e.getWidth() 
       && y+h > e.getY() && y+h < e.getX()+e.getHeight()) { 
      ret = true; 
     }else{ 
      if(rectItr.hasNext()) { 
       rectItr.next(); 
      } 
     } 
    } 
    return ret; 
} 

rectObj rect1 = new rectObj(250,250,50,50); 
    rectObj rect2 = new rectObj(0,440,500,50); 
    rectObj rect3 = new rectObj(0,0,500,50); 
    rectObj rect4 = new rectObj(400,200,50,50); 
    rectObj rect5 = new rectObj(0,200,50,50); 

    rectAr.add(rect1); 
    rectAr.add(rect2); 
    rectAr.add(rect3); 
    rectAr.add(rect4); 
    rectAr.add(rect5); 

Я хочу, чтобы петля продолжать на протяжении всего массива, если он не находит объект, он столкнулся с.

Спасибо за любые ответы!

ответ

2

Вы звоните rectItr.next() второй раз в поле else внутри цикла. Попробуйте удалить часть else инструкции if-else.

Остальная часть проверяет, rectItr.hasNext(), и если у нее есть, то он вызывает rectItr.next(). Затем он возвращается к вершине цикла while, который делает то же самое снова. Поэтому каждый цикл, если тест if является ложным, затем он вызывает rectItr.next() дополнительное время и пропускает следующий элемент в массиве.

+0

Я удалил следующее заявление, и столкновение было обнаружено для другого rectObj, но удалено для одного, которое работало со следующим заявлением. – TIMMEHf32432

+0

А, я полностью удалил оператор if, и теперь он отлично работает! Большое спасибо! – TIMMEHf32432

+0

Отлично, спасибо, что приняли ответ! –

0

@ Дермо верно.

Вы можете реально упростить и переформатировать метод следующим образом:

public boolean bottomLeft() { 
    for (rectObj e : Main.rectAr) { 
     if (x > e.getX() 
       && x < e.getX() + e.getWidth() 
       && y + h > e.getY() 
       && y + h < e.getX() + e.getHeight()) { 
      return true; 
     } 
    } 
    return false; 
} 

... и это показывает, что есть еще одна ошибка в методе. Эта линия

 && y + h < e.getX() + e.getHeight() 

... должно быть ...

 && y + h < e.getY() + e.getHeight() 

... Я думаю.

+0

Спасибо, что указали мою ошибку! Однако «Можно только перебирать массив или экземпляр java.lang.Iterable» – TIMMEHf32432

+0

Ooooh Я не понимал, что работал ха-ха. Благодаря! – TIMMEHf32432

+0

@StephenC Я видел очень интересный разговор/сообщение в блоге некоторое время назад, у которого была конкретная заметка о том, что когда у вас есть разделы кода, которые в значительной степени скопированы, но с небольшими отличиями, в подавляющем большинстве случаев ошибка в одной из более поздних копий просто как это. – will

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