我正在创建一个纸牌游戏,并希望迭代所有可能的卡片组合。
例如(心之王,心之二),(心之王,黑桃之二),(心之王,两个俱乐部)等等
我在java中这样做
目前我有这个:
从我开始
List<Card> deckOfCards = new ArrayList<Card>();
这是一张包含所有卡牌的牌组。然后我创建了一个
Queue<Card> deckOfCardsWithoutDuplicates = new LinkedList<Card>();
deckOfCardsWithoutDuplicates = deckOfCards;
现在我想迭代所有卡片而不重复。
for (Card c : deckOfCards) {
deckOfCardsWithoutDuplicates.remove(c);
for (Card c1 : deckOfCardsWithoutDuplicates) {
//something here irrelevant
}
deckOfCardsWithoutDuplicates.add(c);
}
但是我得到java.util.ConcurrentModificationException
。谁能给我一些关于如何做得更好的提示?
答案 0 :(得分:1)
这是因为您试图从列表中删除您正在循环播放的内容。
要从您正在循环播放的列表中删除,您需要使用iterator
答案 1 :(得分:0)
尝试使用迭代器而不是 foreach 循环
Iterator<Card> iter = deckOfCards.iterator();
while (iter.hasNext()) {
//your logic here
}
当您使用 foreach 循环时,您正在隐式使用迭代器。
当&#34;同时&#34;修改集合时,会发生ConcurrentModificationException 。通过迭代器以任何方式通过集合,迭代器除外。
答案 2 :(得分:0)
您的命名似乎表明您认为您有两个列表,一个最初是另一个列表的副本,但在遍历原始列表时被修改。但它们实际上是相同的列表,并且如其他答案中所述,当您修改要循环的列表时,您将收到此异常。
如果您更改了代码,以便他们真正将列表分开,那么您所显示的问题就不会发生。
更改
Queue<Card> deckOfCardsWithoutDuplicates = new LinkedList<Card>();
deckOfCardsWithoutDuplicates = deckOfCards;
到
Queue<Card> deckOfCardsWithoutDuplicates = new LinkedList<Card>(deckOfCards);
,您可以在循环浏览deckOfCardsWithoutDuplicates
时修改deckOfCards
。
答案 3 :(得分:0)
Singleton和Builder模式可以帮到您。
Singleton用于套装和卡片的价值。
套件示例:
public class Suit {
private String suit;
private Suit(String name) {suit = name;}
public String toString() {return suit;}
public final static Suit CLUBS = new Suit("clubs");
public final static Suit DIAMONDS = new Suit("diamonds");
public final static Suit HEARTS = new Suit("hearts");
public final static Suit SPADES = new Suit("spades");
}
与值类相同,Card类也应该是Singleton,但它们非常多,应该是其他两个Singleton(Suite和Value)的组合:
public class Card {
private Suit s;
private Value v;
protected Card() {}
protected Card(Suit s, Value v) {
this.s = s;
this.v = v;
}
}
来自卡牌制造商(使用构建器模式)的独特Card si保证:
import java.util.Hashtable;
public class CardBuilder extends Card {
private Hashtable<String,Card> _cards = new Hashtable<String,Card>();
public Card getCard(Suit s, Value v) {
String key = s.toString() + v.toString();
Card result = _cards.get(key);
if (result == null) {
result = new Card(s,v);
_cards.put(key,result);
}
return result;
}
}
现在你已经拥有了所有你需要的哈希表,你可以使用你所使用的一些卡片,而不是再使用它。现在主要是您可以在高级别检查中检查您的实施:
public class Game {
public static void main(String args[]) {
CardBuilder cb = new CardBuilder();
Card c1 = cb.getCard(Suit.HEARTS, Value.JACK);
Card c2 = cb.getCard(Suit.HEARTS, Value.JACK);
if (c1 == c2) System.out.println("Ok!!!");
else System.out.println("Something wrong in you implementation!");
}
}
我希望这个例子可以帮助你实现游戏:)