Как остановить нуль от печати
При выполнении моей программы она продолжает отображать "ноль" в строке 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)