Безкраен цикъл, итериращ през ArrayList Java

Опитвам се да създам свой собствен итератор, който преминава през ArrayList от обекти на менюто, който се състои от MenuItems. Всеки елемент от менюто има 4 стойности. Опитвам се да итерирам през arrayList и да върна само стойностите, които имат стойността на категорията MainDish. Продължавам да получавам безкраен цикъл. Трябва да е в метода next() на моя итератор, който имплементира интерфейса на итератора, но за живота си не мога да намеря къде е грешката. Трябва да е мястото, където увеличавам currentIndex, но не мога да го разбера. Всяка помощ се оценява.

Клас на итератор:

package menu;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.NoSuchElementException;


public class ItemIterator implements Iterator<MenuItem> {
private ArrayList<MenuItem> menuList;
private int currentIndex;
private String type;

public ItemIterator(ArrayList<MenuItem> menuList, String type) {
    this.menuList = menuList;
    this.type = type;
    }

@Override
public boolean hasNext() {
    return !(menuList.size() == currentIndex);
}

@Override
public MenuItem next() {

boolean found = false;

    if(hasNext() && !found)
        if(menuList.get(currentIndex).getCategory().equals(type))   
            found = true;
        else
            currentIndex++;         


    if(found = true)
        return menuList.get(currentIndex);
    else
        throw new NoSuchElementException();
    }   


@Override
public void remove() {
    // TODO Auto-generated method stub

}

 }

ето ми основното:

     public static void main(String[] args) {


    MenuItem item1 = new MenuItem("burger", mainDish, false, 10);
    MenuItem item2 = new MenuItem("sandwhich", appetizer, true, 5);

    Menu newMenu = new Menu();

    newMenu.add(item1);
    newMenu.add(item2);




     Iterator<MenuItem> itr = newMenu.getMenuIterator(); 
     System.out.println("ALL MENU ITEMS"); 


     while (itr.hasNext()) 
     { 
     System.out.println(itr.next()); 
     } 

    itr = newMenu.getItemIterator(mainDish); 
     System.out.println("ALL MAIN DISH ITEMS"); 

     while (itr.hasNext()) 
     { 
     System.out.println(itr.next()); 
     } 
  }

person jamesrappazzo    schedule 21.02.2014    source източник
comment
if(found = true) ‹-- тук. Трябва да е ==. Или просто if (found).   -  person fge    schedule 21.02.2014
comment
Защо да използвате итератор? Можете ли да го направите много по-лесно с потребителя на for цикли?   -  person TheBrenny    schedule 21.02.2014
comment
А, промяната му на just if(found) помогна, но сега получавам изключението no such element, към което го накарах като случай по подразбиране. мисли?   -  person jamesrappazzo    schedule 21.02.2014


Отговори (1)


Методът next() трябва да увеличи currentIndex независимо дали текущият елемент съвпада или не. Както е написано, получавате безкраен цикъл веднага щом достигнете действително съвпадение.

Между другото, както е написано, няма причина да не използвате обикновения итератор и да проверите резултата. Ако това, което наистина искате, е итератор, който прескача напред към следващото съвпадение, ще трябва да добавите инкрементен цикъл в метода next().

person Warren Dew    schedule 21.02.2014
comment
Сега получавам изключение без такъв елемент, към което го накарах като случай по подразбиране. - person jamesrappazzo; 21.02.2014
comment
Точно сега, както сте го написали, ще получите NoSuchElementException всеки път, когато текущият елемент не съвпада и извикате next(). - person Warren Dew; 21.02.2014
comment
Предполагам, че следващата ми задача е да разбера къде отива тази циклична структура - person jamesrappazzo; 21.02.2014
comment
Изглежда не мога да разбера как да поставя примката. - person jamesrappazzo; 21.02.2014
comment
Можете да започнете, като замените if(hasNext() && !found) с while(hasNext() && !found). Все пак ще трябва да избягвате хвърлянето на NoSuchElementException, когато итераторът е в точка след последното съвпадение, но преди края. - person Warren Dew; 21.02.2014
comment
Виждам, че сега работи, освен ако последният елемент не съвпада, което току-що казахте, че ще направи. - person jamesrappazzo; 21.02.2014