【问题标题】:Alternatives to linked lists when creating a group of stacked cards in Java?在 Java 中创建一组堆叠卡片时链表的替代方案?
【发布时间】:2017-05-26 07:11:21
【问题描述】:

假设我正在玩一个包含一系列堆叠卡片的纸牌游戏。我不知道在游戏开始之前我会有多少叠牌,但一旦开始,叠牌的数量保持不变。然后我的第一个想法是使用为游戏实例提供的堆栈数创建一个数组,将这些堆栈中的每张顶牌放入数组中,然后使用链表将每张牌链接到它们的堆栈。

我的 Card 类有以下字段:

public class Card {
  private String suit;
  private String value;

  public Card cardInFront = null;
  public Card cardInBack = null; 

例如,假设给了我一副标准牌(52 张牌、4 个花色、13 个值),要分成 5 叠。我以循环方式将前五张牌分配到一组 5 个开口中,如下所示:

int numOfPiles = 5;

Card[] cascadePiles = new Card[numOfPiles];
for (int i = 0; i < numOfPiles; i++) {
  cascadePiles[i] = deck.get(i);
}

然后我继续以循环方式发牌,但将我发的每张牌都连接到它前面的牌和它后面的牌。这一切都通过以下代码完成:

    int x = 0;
    while (x != numOfPiles) {
      deck.remove(0);
      x++;
    }
    int i = 0;

    while (!deck.isEmpty()) {
      if (i < numOfPiles) {
        Card cardBehind = cascadePiles[i];
        Card temp = cascadePiles[i];
        Card nullSearcher = cascadePiles[i].cardInFront;
        while (nullSearcher != null) {
          cardBehind = temp;
          temp = nullSearcher;
          nullSearcher = temp.cardInFront;
        }
        addToPile(temp, deck.get(0), cardBehind);
        temp.cardIsInPile = PileType.CASCADE;
        deck.remove(0);
        i++;
      } else {
        i = 0;
      }
    }

我在链表中​​完成这一切的原因是因为我不知道每场比赛需要多少堆栈。如果我使用一般列表,我必须知道在比赛开始前要申报多少,而我不知道。但是,通过像这样组织堆栈,我遇到了几个 NullPointerExceptions,而且我读到使用 null 通常只是不好的做法。有没有更聪明的方法来做到这一点?

【问题讨论】:

  • 为什么你不能使用List&lt;Card&gt;[]?这会忽略Card 中的cardInFront- 和cardInBack-references 的需要。
  • 即使您不知道需要多少堆栈,您也可以使用通用列表,因为 List 支持 addremove 等,并且您不需要将大小传递给实现构造函数(例如ArrayList)预先
  • 无论如何,您能告诉我们deck 变量定义及其类/接口定义吗?
  • @niceman 是的,套牌被定义为:List&lt;Card&gt; deck = new ArrayList(); for (int i = 0; i &lt; suitArray.length; i++) { for (int j = 0; j &lt; valueArray.length; j++) { deck.add(new Card(suitArray[i], valueArray[j])); } } suitArray 和 valueArray 只是典型套牌中包含花色字符串和值的数组
  • @Turing85 我不必命名这些 List 实例才能使用它们吗?

标签: java list nullpointerexception linked-list containers


【解决方案1】:

据我了解,ArrayList&lt;LinkedList&lt;Card&gt;&gt; 之类的数据类型可以完成这项工作。

ArrayList<LinkedList<Card>> listOfCardStack=new ArrayList<LinkedList<Card>>();

LinkedList<Card> stack0 = new LinkedList<Card>();

Card card0=new Card...

stack0.add(card0);

stack0.add(card1);

...

listOfCardStack.add(stack0);

...

【讨论】:

  • 如果我不知道每场比赛我会得到多少堆栈,我怎么能命名每个堆栈?
  • 您不必知道您将获得的堆叠数量。您正在使用 LinkedList 类,它实现了 java.util.List。当你得到一个新堆栈时,像上面一样创建一个linkedList,填充它并添加到listOfCardStack。
猜你喜欢
  • 2018-08-06
  • 2022-01-02
  • 1970-01-01
  • 2020-07-21
  • 2017-08-24
  • 1970-01-01
  • 2019-05-30
  • 2011-06-27
  • 2011-07-04
相关资源
最近更新 更多