Mit next() zum Aufruf der nächsten iteration der ArrayList
Wir haben hier ein bisschen Probleme mit dem iterator next(). Kann nicht scheinen, um es richtig zu arbeiten. Ich habe mit diesem code für eine Weile, also dachte ich mir einen anderen Satz von Augen helfen würde.
Dies ist mein deck Klasse erstellt eine Liste der Karten-Objekte, ich versuche eine Methode zu greifen, die nächste Karte in der Liste beginnend mit dem ersten:
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;
}
}
Dies ist meine main-Klasse, wo rufe ich die getNextCard() und was ich mir denke, Sie tun sollten, ist drucken die erste und dann die nächste Karte in der Liste, aber was es tut, ist drucken die erste Karte zweimal.
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());
}
}
Vielen Dank im Voraus für jede Hilfe!!!
Liebe deine subtil Endlosschleife, in
sieht aus wie Sie ' re immer einen neuen iterator jedes mal
getNextCard()
!sieht aus wie Sie ' re immer einen neuen iterator jedes mal
InformationsquelleAutor ivanthemeh | 2013-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem
getNextCard()
Methode, die Sie erstellen einen iterator jedes mal, wenn es aufgerufen wird. Iteratoren beginnen immer mit index 0 (obwohl es einelistIterator(index)
Methode), aber Sie sollten nicht brauchen.Option 1: verfolgen das iterator-und das gleiche iterator jedes mal. Dies hat jedoch ein großes Manko nicht hingewiesen hat, wer sonst noch. Aus der Javadoc:
Übersetzung: Wenn Sie änderungen an der Liste in irgendeiner Weise außerhalb des iterator (sagen wir, durch das hinzufügen einer Karte zu der Ende der Liste), dann ist dein iterator bricht. Das führt uns zu Möglichkeit 2:
Option 2: Halten Sie einen Zähler für den index, den Sie zurückgegeben werden Letzte, und einfach zurück, dass jeder Zeit. So etwas wie:
Und schließlich Option 3: (nicht empfohlen): Wenn Sie es wirklich wollten, könnten Sie fangen die
ConcurrentModificationException
und generieren Sie einen neuen iterator an diesem Punkt, aber es gibt nicht wirklich einen Grund zu, es sei denn, Sie benötigen einige iterator-spezifische Funktion. (Dieget()
nennen ist genau so schnell wie ein interator - beide sind Konstante Zeit).Ja, das wäre ratsam. Viel Glück!
InformationsquelleAutor mdierker
Speichern Sie die iterator zurückgegeben
cards.listIterator()
.Ihren code erstellt eine neue zu jeder Zeit, das heißt, Sie bekommen immer das erste element.
InformationsquelleAutor Duncan Jones
Erhalten Sie immer die erste Karte, weil Sie die Schaffung einer neuen iterator jedes mal, wenn Sie rufen Sie die
getNextCard ()
Methode. Die Liniewird immer einen neuen iterator. Was Sie tun möchten würde das so Aussehen (vorausgesetzt, Sie möchten, erstellen Sie eine neue
ListIterator
- Instanz jedes mal, wenn Sie erreicht haben, die Letzte Karte des Decks):Ja, ich hatte einen Fehler gemacht. Ich befestigte den
return
- Anweisung mit dem richtigen code.InformationsquelleAutor Laf