洗牌 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];

这些都设置为空,因此如果您对其中一张卡片执行操作,您会得到一个空指针异常。这可以解释为什么您会得到所有这些空值。