gpt4 book ai didi

java - 使用 next() 调用 ArrayList 的下一次迭代

转载 作者:行者123 更新时间:2023-12-02 04:38:23 24 4
gpt4 key购买 nike

迭代器 next() 遇到了一些问题。似乎无法让它正常工作。我已经研究这段代码有一段时间了,所以我认为另一双眼睛会有所帮助。

这是我的牌组类,它创建了一个 Card 对象列表,我正在尝试创建一个方法来获取列表中的下一张卡,从第一张卡开始:

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;
}
}

这是我的主类,我在其中调用 getNextCard(),我认为它应该做的是打印列表中的第一张卡,然后打印下一张卡,但它所做的是打印第一张卡两次。

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());
}

}

预先感谢您的帮助!

最佳答案

getNextCard() 方法中,每次调用时都会创建一个迭代器。迭代器始终从索引 0 开始(尽管有一个 listIterator(index) 方法),但您不需要它。

选项 1:跟踪迭代器,并每次都使用相同的迭代器。然而,这有一个尚未被其他人指出的重要缺点。来自 Javadoc:

The iterators returned by this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException.

翻译:如果您在迭代器之外以任何方式修改列表(例如,通过在列表末尾添加一张卡片),那么您的迭代器就会中断。这导致我们选择 2:

选项 2:保留您上次返回的索引的计数器,并且每次只返回该索引。像这样的东西:

public class Deck {

public ArrayList<Card> cards = new ArrayList<>();
Card next;
int currentCardIndex = -1;

/* The initialization stuff you have above */

public Card getNextCard() {

currentCardIndex++;

// If we're at the end, go back to the beginning
if (currentCardIndex >= cards.size()) {
currentCardIndex = 0;
}

return (next = cards.get(currentCardIndex));
}

最后选项 3:(不建议):如果您确实愿意,您可以捕获 ConcurrentModificationException 并在此时生成一个新的迭代器,但没有除非您需要一些特定于迭代器的功能,否则这确实是一个理由。 (get() 调用与迭代器一样快 - 两者都是恒定时间)。

关于java - 使用 next() 调用 ArrayList 的下一次迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16244205/

24 4 0