Как остановить нуль от печати - PullRequest
0 голосов
/ 20 января 2019

При выполнении моей программы она продолжает отображать «ноль» в строке 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 ]

0 голосов
/ 20 января 2019

Ваш метод next() не должен содержать ни одного регистра, который бы возвращал недопустимое значение, например null. Если нет следующего элемента, который должен быть возвращен, это hasNext() метод job , который возвращает 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);
    }
}
0 голосов
/ 20 января 2019

Убедитесь, что nextCardSpade равно 0 также:

if (nextCardSpade <= 0)
...