【问题标题】:How can a method that shuffles cards be declared in Java?如何在 Java 中声明一个洗牌的方法?
【发布时间】:2020-07-21 14:40:34
【问题描述】:

此方法旨在洗牌。当前方法声明具有“void”返回类型,并且在运行代码时出现错误“方法声明无效;需要返回类型”。可以改用什么返回类型?

public void shuffle()
{
    int count = 0;
    int index = 0;
    
    for(int i; i = 100; i++)
    {
        count = (int)Math.Random() * 52;
        index = (int)Math.Random() * 52;
        
        DeckofCards[count] = DeckofCards[index];
        DeckofCards[index] = DeckofCards[count];
    }
    
}

【问题讨论】:

  • 如何交换两个整数变量ab的值?
  • 我建议使用不同的算法 - 将i-th 卡和具有随机索引的卡从i + 1 交换为 100:random.nextInt(i + 1, 101)。您需要事先创建一个Random 实例:Random random = new Random()

标签: java methods return declaration


【解决方案1】:

问题在于 for 循环。您声明 int i,但从未初始化。条件段当前是一个分配。您需要初始化并更改条件。

for (int i = 0; i < 100; i++) {

}

【讨论】:

    【解决方案2】:

    首先,您需要初始化计数器i,并将第二部分中的赋值更改为比较。其次,要交换两个变量,您需要使用一个临时变量,这样第一个变量的值就不会丢失。

    for(int i = 0; i < 100; i++){
        count = (int)Math.Random() * 52;
        index = (int)Math.Random() * 52;
        Card temp = DeckofCards[count];//assuming DeckofCards is an array of Card objects
        DeckofCards[count] = DeckofCards[index];
        DeckofCards[index] = temp;
    }
    

    【讨论】:

    • 你不需要。您可能想要使用临时变量。
    • @Jack 这取决于被交换的变量的类型。我怀疑 XOR 技巧可以在这里应用。
    【解决方案3】:

    您从未在循环中初始化 i。而且您没有正确交换卡片。但无论如何这都不是洗牌的好方法。

    我建议你这样做。这将保证对列表进行一次出色的洗牌迭代。已移至列表末尾的卡片将不会再次移动。我推测这些卡片是Card 之类的类型。

    public static void shuffle(DeckOfCards[] v) {
        int count = v.length;
        Random r = new Random();
        while (count > 0) {
           int next = r.nextInt(count);
           Card temp = v[next];
           v[next] = v[--count];
           v[count] = temp;
          }
       }
    }
    

    您也可以将卡片放入List 并致电Collections.shuffle()

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多