2015-01-05 4 views
4

Не могу понять, почему это происходит бесконечно.Java Iterator Бесконечная петля

public void DLCCheck(IconSet iconSet) { 
    Log.d(TAG, "Got dlc check. Looking to see if we need to remove any notes from the current list."); 
    int foundCount = 0; 
    for(Iterator<Item> i = mItemList.iterator(); i.hasNext();) { 
     if(i instanceof NoteItem && ((NoteItem) i).getIconSet() == iconSet) { 
      i.remove(); 
      foundCount++; 
     } 
    } 
    Log.d(TAG, "Finished searching. Found " + foundCount + "notes in the current list to delete."); 
    //notifyDataSetChanged(); 
    //EventBus.getDefault().post(new MoveNoteListOut()); 
} 

Не следует ли останавливать итерацию, когда hasNext возвращает false? В этом списке всего 6 наименований, но навсегда.

+0

Это было на самом деле полезно. Почему это не по теме? – dan

ответ

11

Вы никогда не звоните i.next(). Кроме того, i - instanceof Iterator, поэтому i instanceof NoteItem никогда не будет true. Вы должны прочитать данные в i.next() и оценить такой элемент с вашими условиями.

Это в том, как код должен быть:

for(Iterator<Item> i = mItemList.iterator(); i.hasNext();) { 
    Item item = i.next(); 
    if(item instanceof NoteItem && ((NoteItem) item).getIconSet() == iconSet) { 
           //here ---------------------------^^ 
           //not sure what type returns getIconSet 
           //but if it's not a primitive then you should use equals 
     i.remove(); 
     foundCount++; 
    } 
} 
+0

Спасибо! Почему я должен использовать метод equals, если это не примитив? – AnnonAshera

+0

Потому что в ссылках на объекты '==' проверяет равенство ссылок, а 'equals' оценивает равенство состояния ссылок. Это лучше объяснить здесь: [Как сравнить строки в Java?] (Http://stackoverflow.com/q/513832/1065197) –

+0

ах да. Спасибо. – AnnonAshera

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