0

问题:编写一个程序 Deal.java,它接受命令行参数 N 并从洗好的牌组中打印出 N 手牌(每手五张牌),用空行分隔。

是)我有的:

public static void main(String[] args)
{
    int N = Integer.parseInt(args[0]);


    String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" };
    String[] rank = 
    { 
        "2", "3", "4", "5", "6", "7", "8", "9", "10", 
        "Jack", "Queen", "King", "Ace" 
    };

    // initialize cards in a deck
    String[] deck = new String[suit.length * rank.length];
    for (int i = 0; i < rank.length; i++)
        for (int j = 0; j < suit.length; j++)
            deck[rank.length*i + j] = rank[i] + " of " + suit[j];

    // shuffle deck
    int d = deck.length;
    for (int i = 0; i < d; i++)
    {
        int r = i + (int) (Math.random() * (d-i));
        String temp = deck[r];
        deck[r] = deck[i];
        deck[i] = temp;
    }

    // repeat for N number of people
    for (int t = 0; t < N; t++)
    {
        // print 5 random cards
        for (int i = 0; i < 5; i++)
            System.out.print(deck[i] + " ");
        System.out.println();
    }   


} 

谁能告诉我我在这里做错了什么?我收到一个错误 ArrayIndexOutOfBoundsExceptions,不知道为什么。这是我书中练习集的一个问题,而不是家庭作业。

4

3 回答 3

2

我假设您在这一行遇到了数组索引越界异常:

deck[rank.length*i + j] = rank[i] + " of " + suit[j];

你一定是这个意思:

deck[suit.length*i + j] = rank[i] + " of " + suit[j];
于 2012-02-19T18:00:39.673 回答
2

除了 ruakh 发现的索引错误之外,您还打印出相同的手牌N时间:

// repeat for N number of people
for (int t = 0; t < N; t++)
{
    // print 5 random cards
    for (int i = 0; i < 5; i++)
        System.out.print(deck[i] + " ");
    System.out.println();
}

要打印出不同的手牌,请使用另一个索引变量,

// repeat for N number of people
int j = 0
for (int t = 0; t < N; t++)
{
    // print 5 random cards
    for (int i = 0; i < 5; i++, j++)
        System.out.print(deck[j] + " ");
    System.out.println();
}   
于 2012-02-19T18:00:42.173 回答
0

我看不出有什么问题似乎可以正常工作,请尝试提供更多详细信息。

你应该改进的是:

检查参数是否在开始时正确设置:

public static void main(String[] args)
{
    int N = Integer.parseInt(args[0]);

String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" };
String[] rank = 
{ 
    "2", "3", "4", "5", "6", "7", "8", "9", "10", 
    "Jack", "Queen", "King", "Ace" 
};

    if(N < 0 || N > suit.length * rank.length)
      throw new IllegalArgumentException("A number between 0 and " + suit.length * rank.length + "should be provided as argument");
于 2012-02-19T18:16:47.723 回答