Реализуйте remove () для итераторов, когда выполняете итерацию со спины в Java - PullRequest
0 голосов
/ 19 января 2019

Я хочу выполнить итерацию с конца списка, и для каждого элемента, который я прохожу, я хочу удалить его. Я хочу реализовать remove () для итератора, но не работает. Кто-нибудь может помочь мне с реализацией удаления? Пока это мой код, я удалил некоторые функции, чтобы не было путаницы:

public class Deck implements Iterable <Card>{

static int count=0;
List<Card> cards;


public Deck(){
    cards = Arrays.asList(new Card[52]);
    Collections.shuffle(cards); //shuffles the cards in the deck
    System.out.println(cards);
    System.out.println("size:"+cards.size());
}

@Override
public Iterator<Card> iterator() {

    return new DeckIterator(cards);
}

//iterate ftom the last card to the the bottom card
private class DeckIterator implements Iterator<Card>{

    private int nextCard;
    private final List<Card> cards;
    boolean canRemove = false;
    private int nCards;

   public DeckIterator(List cards){
       this.cards=cards;
       this.nextCard = cards.size()-1;
       nCards = cards.size();
   }

    @Override
    public boolean hasNext() {
        if(cards.isEmpty() || nextCard<0){
            return false;
        }
        return true;
    }

   @Override
    public Card next() {
        Card temp;
        Iterator<Card> it = this.cards.iterator();
        if(hasNext()){
            temp = cards.get(nextCard--);
            canRemove = true;
            return temp;
        }
        return null;
    }

    //ITERATOR'S REMOVE 
    public void remove() {

    }
 }

  public static Card deal(Deck deck){
    Card topCard = null;
    int i=0;
    Iterator<Card> it = deck.iterator();
    Card temp;
    temp = it.next();
    while(it.hasNext() && i<count){
        temp = it.next();
    }
    it.remove();       //WHERE REMOVE IS BEING CALLED
    count++;

    return topCard;
}

public static void main (String[] argvs){

    Deck deck = new Deck();
    Iterator<Card> it = deck.iterator();

    while(it.hasNext()){
        System.out.println(it.next());

    }
    deal(deck);
    deal(deck);   
   }
}

1 Ответ

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

Вы можете использовать метод iterator () из интерфейса List:

@Override
public Iterator<Card> iterator() {
     List<Card> newList = new ArrayList<>(this.cards); // copy to preserve original List order
     Collections.reverse(newList);
     return newList.iterator();
}

Таким образом, вам не нужно реализовывать интерфейс Iterator.

...