Utilisation de la fonction next() pour appeler l'itération suivante de la liste de tableaux
Avoir un peu de mal avec l'itérateur next(). Ne semble pas possible de l'obtenir pour fonctionner correctement. J'ai travaillé sur ce code pour un moment donc je pensais à une autre paire d'yeux peut aider.
C'est mon deck classe avec crée une liste des objets de la Carte, je suis en train de faire une méthode pour attraper la prochaine Carte dans la liste, en commençant par le premier:
package blackjack;
import blackjack.Card.Rank;
import blackjack.Card.Suit;
import java.util.*;
public class Deck {
public ArrayList<Card> cards = new ArrayList<>();
int i;
Card next;
public Deck() {
initializeDeck();
}
public void printDeck() {
for (Card c: cards)
System.out.println(c);
}
private void initializeDeck() {
for (Suit suit : Suit.values()) {
for (Rank rank : Rank.values()) {
cards.add(new Card(rank, suit));
}
}
}
public Card getNextCard() {
if (cards.listIterator().hasNext() != true) {
getNextCard();
}
else {
next = cards.listIterator().next();
}
return next;
}
}
C'est ma classe principale où j'appelle la getNextCard() et ce que je suis en train de penser qu'il doit faire est d'imprimer à la première, puis la prochaine Carte dans la liste, mais qu'il fait c'est de l'impression de la première Carte à deux reprises.
package blackjack;
import java.util.*;
public class BlackJack {
public static void main(String[] args) {
Deck deck = new Deck();
System.out.println(deck.getNextCard());
System.out.println(deck.getNextCard());
}
}
Merci d'avance pour toute aide!
getNextCard()
!on dirait que vous êtes l'obtention d'un nouvel itérateur à chaque fois
OriginalL'auteur ivanthemeh | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
Dans votre
getNextCard()
méthode, vous êtes en train de créer un itérateur à chaque fois qu'il appelle. Les itérateurs toujours commencer à l'indice 0 (bien qu'il y est unlistIterator(index)
méthode), mais vous ne devriez pas en avoir besoin.Option 1: Garder une trace de l'itérateur, et utiliser le même itérateur à chaque fois. Cependant, cela a une importante lacune de ne pas remarquer par quelqu'un d'autre encore. À partir de la Javadoc:
Traduction: Si vous modifiez la liste en aucune façon à l'extérieur de l'itérateur (par exemple, par l'ajout d'une carte à la fin de la liste), puis votre itérateur pauses. Ce qui nous amène à l'option 2:
Option 2: Garder un compteur de l'index de retour de la dernière, et il suffit de le retourner à chaque fois. Quelque chose comme:
Et enfin Option 3: (non conseillé): Si tu le voulais vraiment, vous pourriez attraper la
ConcurrentModificationException
et générer un nouvel itérateur à ce point, mais il n'est pas vraiment une raison de faire, sauf si vous avez besoin d'un itérateur de fonctionnalité spécifique. (Leget()
appel est tout aussi rapide comme un interator - les deux sont à temps constant).Yep, ce serait souhaitable. Bonne chance!
OriginalL'auteur mdierker
Vous avez besoin pour économiser de l'itérateur renvoyé par
cards.listIterator()
.Votre code en crée une nouvelle à chaque fois, ce qui signifie que vous obtenez toujours le premier élément.
OriginalL'auteur Duncan Jones
Vous obtenez toujours la première carte parce que vous êtes la création d'un nouvel itérateur chaque fois que vous appelez le
getNextCard ()
méthode. La lignesera toujours de créer un nouvel itérateur. Ce que vous voulez faire ressemblerait (en supposant que vous souhaitez créer un nouveau
ListIterator
exemple à chaque fois que vous avez atteint la dernière carte de la pioche):Ouais j'avais fait une erreur. J'ai corrigé le
return
déclaration avec le bon code.OriginalL'auteur Laf