Как остановить нуль от печати

При выполнении моей программы она продолжает отображать "ноль" в строке 13. Я хочу знать, что не так в моем алгоритме, поскольку он продолжает печатать ноль.

private class SpadeIterator implements Iterator<Card>{
    private int nextCardSpade;
    private List<Card> cards;
    private int count=0;
    private SpadeIterator(List cards) {
        this.cards=cards;
        this.nextCardSpade = cards.size()-1;
    }

    @Override
    public boolean hasNext() {
        count++;
        if(nextCardSpade<0)
            return false;
        //nextCardSpade--;
        return true;
    }

   @Override
    public Card next() {

        int i=0;
        this.count=i;
        Card temp = cards.get(nextCardSpade);

        while(hasNext()){    //find SPADES
            temp=cards.get(nextCardSpade--);
            i++;

            if(temp.suit.value == Suit.SPADES.value)
                return temp;
        }
        //DONT MOVE
        return null;
        //nextCardSpade--;      //DONT DELETE

    }
}

Текущие результаты

Результаты должны показать 13 пиков, не возвращая ноль в конце.

2 ответа

Ваш next() метод не должен содержать ни одного случая, который бы возвращал неверное значение, например null, Если нет следующего элемента, который нужно вернуть, это hasNext() работа метода, чтобы вернуться false чтобы вы не звонили next(),

Так что ваш код должен выглядеть больше как

class SpadeIterator implements Iterator<Card>{
    private int spadesCounter = 0;
    private Iterator<Card> cardsIt;

    private SpadeIterator(List<Card> cards) {
        cardsIt = cards.iterator();
    }

    @Override
    public boolean hasNext() {
        return spadesCounter<13; // we can't put spacesCounter++ here because 
                                 // we should be able to call `hasNext()` many times
                                 // and still get same answer,
                                 // so `hasNext()` shouldn't change any state 
                                 // (at least one which could cause changing its result)
    }

    @Override
    public Card next() {
        Card temp = cardsIt.next(); //if our `hasNext()` returned `false` but we 
                                    //didn't check or ignored it, this will CORRECTLY 
                                    //throw NoSuchElementException 
        while(temp.suit.value != Suit.SPADES.value){
            temp = cardsIt.next();
        }
        spadesCounter++;
        return temp;
    }
}

ИЛИ, если вы просто хотите перебрать список и распечатать только выбранные элементы, вы можете использовать потоки с фильтрацией, как

List<Card> cards = ...//not really important how get it
cards.stream()
     .filter(card -> card.suit.value == Suit.SPADES.value)
     .forEach(card -> System.out.println(card));

или даже проще

for (Card card : cards){
    if(card.suit.value == Suit.SPADES.value){
        System.out.println(card);
    }
}

Проверь это nextCardSpade равно 0 также:

if (nextCardSpade <= 0)
Другие вопросы по тегам