洗牌 Java 中的对象数组:为什么此方法适用于 int 但不适用于我的对象?
Shuffling array of objects in Java: Why does this method work for int but not for my objects?
我知道,我知道 - 这里有数百人询问如何在 Java 中洗牌和排列 52 个卡片对象,我认为这很简单。我没有使用过集合(基于堆栈上的建议)。我已经尝试过 Fisher-Yates 洗牌,但我看到了看起来非常奇怪的行为...有人可以帮忙吗?
我的解决方案基于这个答案:Random shuffling of an array
而且它非常适合……用于数字。这个 Class 有两个数组,一个包含从 0 到 51 的数字,另一个包含 52 个具有各种实例变量的 Card 对象,例如 suit 和 number。
此代码完美运行:
public void shuffleNums()
{
Random rnd = new Random();
for (int i = this.numbers.length -1; i > 0; i--)
{
int index = rnd.nextInt(i + 1);
// Simple swap
int temp = this.numbers[index];
this.numbers[index] = this.numbers[i];
this.numbers[i] = temp;
}
}
但是当我尝试在一副 52 张卡片对象上使用相同的方法时,如下所示:
public void shuffleCards()
{
Random rnd = new Random();
for (int i = this.cards.length - 1; i > 0; i--)
{
int index = rnd.nextInt(i + 1);
// Simple swap
Card temp = this.cards[index];
this.cards[index] = this.cards[i];
this.cards[i] = temp;
}
}
效果不是很好。大多数牌都已成功洗牌,但显然我已经丢掉了一半牌组,因为现在数组有大约 16 个 NULL 值并且只有大约 36 张随机牌。 NULL 似乎随机分布在整个数组中。
我可以很容易地解决这个问题,但我想了解为什么会这样。谁能帮我弄清楚这是怎么回事?
编辑:
关于我如何初始化数组——我检查过数组实际上确实有 52 个 Card 对象,从 2 个梅花到黑桃 A。在执行 shuffle() 之前,数组正确包含 52 个卡片对象。之后它包含大约 36 - 给予或接受。
可能是你初始化卡的问题。
如果你这样做
int[] cards = new int[52];
int数组中的所有内容都将设置为0,这意味着您可以对其进行操作
但是如果你这样做
Card[] cards = new Card[52];
这些都设置为空,因此如果您对其中一张卡片执行操作,您会得到一个空指针异常。这可以解释为什么您会得到所有这些空值。
我知道,我知道 - 这里有数百人询问如何在 Java 中洗牌和排列 52 个卡片对象,我认为这很简单。我没有使用过集合(基于堆栈上的建议)。我已经尝试过 Fisher-Yates 洗牌,但我看到了看起来非常奇怪的行为...有人可以帮忙吗?
我的解决方案基于这个答案:Random shuffling of an array
而且它非常适合……用于数字。这个 Class 有两个数组,一个包含从 0 到 51 的数字,另一个包含 52 个具有各种实例变量的 Card 对象,例如 suit 和 number。
此代码完美运行:
public void shuffleNums()
{
Random rnd = new Random();
for (int i = this.numbers.length -1; i > 0; i--)
{
int index = rnd.nextInt(i + 1);
// Simple swap
int temp = this.numbers[index];
this.numbers[index] = this.numbers[i];
this.numbers[i] = temp;
}
}
但是当我尝试在一副 52 张卡片对象上使用相同的方法时,如下所示:
public void shuffleCards()
{
Random rnd = new Random();
for (int i = this.cards.length - 1; i > 0; i--)
{
int index = rnd.nextInt(i + 1);
// Simple swap
Card temp = this.cards[index];
this.cards[index] = this.cards[i];
this.cards[i] = temp;
}
}
效果不是很好。大多数牌都已成功洗牌,但显然我已经丢掉了一半牌组,因为现在数组有大约 16 个 NULL 值并且只有大约 36 张随机牌。 NULL 似乎随机分布在整个数组中。
我可以很容易地解决这个问题,但我想了解为什么会这样。谁能帮我弄清楚这是怎么回事?
编辑: 关于我如何初始化数组——我检查过数组实际上确实有 52 个 Card 对象,从 2 个梅花到黑桃 A。在执行 shuffle() 之前,数组正确包含 52 个卡片对象。之后它包含大约 36 - 给予或接受。
可能是你初始化卡的问题。
如果你这样做
int[] cards = new int[52];
int数组中的所有内容都将设置为0,这意味着您可以对其进行操作
但是如果你这样做
Card[] cards = new Card[52];
这些都设置为空,因此如果您对其中一张卡片执行操作,您会得到一个空指针异常。这可以解释为什么您会得到所有这些空值。