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