【问题标题】:Shuffling array of objects in Java: Why does this method work for int but not for my objects?在 Java 中洗牌对象数组:为什么此方法适用于 int 而不适用于我的对象?
【发布时间】:2015-03-16 04:47:03
【问题描述】:

我知道,我知道 - 这里有数百人询问如何在 Java 中洗牌和排列 52 个卡片对象,我认为这很简单。我没有使用过集合(基于堆栈上的建议)。我已经尝试过 Fisher-Yates 洗牌,但我看到了看起来很奇怪的行为......有人可以帮忙吗?

我的解决方案基于这个答案:Random shuffling of an array

而且效果很好……对于数字。该类有两个数组,一个包含从 0 到 51 的数字,另一个包含 52 个 Card 对象,其中包含各种实例变量,例如花色和数字。

这段代码完美无缺:

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 个 Card 对象的方法使用相同的方法时,如下所示:

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 个 - 给予或接受。

【问题讨论】:

  • 由于您的代码是相同的,看起来可能不同的是cards 数组的初始状态。你能发布初始化这个数组的Card值的代码吗?
  • (4-1) * (13-1) 恰好是 36...你能在那个代码中有一个错误吗?
  • 恐怕这不是初始化的事情,我也担心它不是始终如一地剩余 36 张卡。 :-( 恐怕我无法向您展示我用来初始化数组的代码,因为我已经编辑了它,而且我的 uni 要我使用的 IDE 没有任何直接的源代码控制集成。(我知道! ) 但是,它基本上创建了 52 个新卡片对象并循环遍历数字 1 到 13,并根据数字是在 13 的第一个块还是第二个等来使用花色。
  • 好吧,就像我说的,您发布的内容没有显示任何可能的错误。尝试创建一个可以运行的简短示例来演示问题,然后发布它。如果你成功地证明了问题,这里的人可能会找到原因。如果您的示例没有说明问题......那么您已经编写了一个正确代码示例以在您的程序中使用。双赢。还是您最后的评论意味着您已经修复了它?
  • 好吧,我尝试重新创建它,但我做不到。现在它似乎起作用了。很抱歉浪费了大家的时间。 :(

标签: java arrays random shuffle poker


【解决方案1】:

可能是你初始化的卡有问题。

如果你这样做了

int[] cards = new int[52];

int 数组中的所有内容都将设置为 0,这意味着您可以对其执行操作

如果你这样做了

Card[] cards = new Card[52];

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多