迭代所有卡片组合

时间:2014-11-19 11:15:03

标签: java

我正在创建一个纸牌游戏,并希望迭代所有可能的卡片组合。

例如(心之王,心之二),(心之王,黑桃之二),(心之王,两个俱乐部)等等

我在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。谁能给我一些关于如何做得更好的提示?

4 个答案:

答案 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!");
 }
}

我希望这个例子可以帮助你实现游戏:)