当前位置: 首页 > 知识库问答 >
问题:

迭代所有卡片的组合

姬熙云
2023-03-14

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

例如(红心A,红心2),(红心A,黑桃2),(红心A,梅花2)等

我在用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.ConvoltModificationException。有人能给我一些关于如何做得更好的提示吗?

共有3个答案

越俊驰
2023-03-14

尝试使用迭代器而不是foreach循环

Iterator<Card> iter = deckOfCards.iterator();
    while (iter.hasNext()) {
   //your logic here
}

当您使用foreach循环时,您隐式地使用了迭代器。

当集合通过迭代器通过任何方式(迭代器除外)“同时”修改集合时,就会发生异常

楚苏燕
2023-03-14

模式Singleton和Builder将为您提供帮助。

单身汉是用来套用和估价卡片的。

套房示例:

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

对于value类也是一样,Card类也应该是单例,但它们太多了,应该是其他两个单例(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;
  }
}

卡片生成器提供的唯一卡片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!");
 }
}

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

白学
2023-03-14

这是因为您试图从循环浏览的列表中删除。

要从循环遍历的列表中删除,您需要使用迭代器

 类似资料:
  • 我需要迭代两个元素的所有组合:在集合[1,2,3,4]中,我想迭代[(1,2),(1,3),(1.4),(2,3),,(2,4),(3,4)]。是否有现有的工具可以执行此操作? 这段代码将执行两倍于所需的操作,因为在两个循环中都将访问每个对象。 为此编写自己的方法是微不足道的,我只是不想发明轮子。我期望在Guava或Collections API中找到这个,但是没有找到这样的功能。

  • 问题内容: 说我有一个列表L。如何获得K组所有分区上的迭代器? 示例:L = [2,3,5,7,11,13],K = 3 3组的所有可能分区的列表: ===更新=== 我正在研究一个似乎可行的解决方案,所以我只复制粘贴它即可 输出: 问题答案: 这可行,尽管它可能超级无效(我将它们全部排序以避免重复计算): 它还返回空簇,因此您可能希望将其包装起来以便仅获取非空簇: 计数只是为了检查: 有用 !

  • 在我的应用程序中,我需要数组1的给定大小k的所有子集。。n 这可以使用递归方法轻松完成,并存储沿途找到的所有子集。然而,我不希望我的应用程序使用指数级的内存量[O(n^k)]。 因此,我想编写一个实现(Java)的类来迭代所述子集。 所以我可以如下使用它: 显然,我们需要存储最后返回的当前子集,它被初始化为1... k。但是如何从这个当前子集计算下一个子集呢?

  • 卡片是包含一组特定数据集的纸片,数据集含有各种相关信息,例如,关于单一主题的照片,文本,和链接。卡片通常是通往更详细复杂信息的入口。卡片有固定的宽度和可变的高度。最大高度限制于可适应平台上单一视图的内容,但如果需要它可以临时扩展(例如,显示评论栏)。卡片不会翻转以展示其背后的信息。 用途 卡片是用来显示由不同种类对象组成的内容的便捷途径。它们也适用于展示尺寸或操作相当不同的相似对象,像带有不同长度

  • 在此模板中,卡片组件是使用最广泛的。你可以将其用于显示图表、文本块等。有许多不同的样式,我们将在下面进行介绍。 默认卡片标记 <div class="card"> <div class="card-header"> <h3 class="card-title">默认卡片示例</h3> <div class="card-tools"> <!-- 按钮,标签和其

  • 问题内容: 好的,我认为这可能是一个老问题,但是我在stackoverflow上没有发现任何东西。在go中,不保证地图上的迭代顺序是可重现的。因此,建议的方法是将键保留在一个切片中并对该切片进行排序。然后,对该切片进行迭代以从映射中检索值,以便我们按顺序获取它们(因为由键组成的切片已排序,因此将以可再现的顺序排列)。因此,这意味着需要对切片进行排序,否则切片上的迭代也不会给出可重现的顺序。但是,当