2013-07-15 151 views
0

这里是代码:解释代码

基本上,这个代码打印出了52张套装+排行榜。

package javaapplication52; 

public class JavaApplication52 { 

    public static void deck() { 

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

     // avoid hardwired constants 
     int SUITS = suit.length; 
     int RANKS = rank.length; 
     int N = SUITS * RANKS; 
     // initialize deck 
     String[] deck = new String[N]; 
     for (int i = 0; i < RANKS; i++) { 
      for (int j = 0; j < SUITS; j++) { 
       deck[SUITS * i + j] = rank[i] + " of " + suit[j]; 

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

     // print shuffled deck 
     for (int i = 0; i < N; i++) { 
      System.out.println(deck[i]); 

     } 

    } 

    public static void main(String[] arg) { 

     JavaApplication52 d = new JavaApplication52(); 

     d.deck(); 

    } 
} 

事实上也没有意义,我

deck[SUITS * i + j] = rank[i] + " of " + suit[j] 

我做了没有根据的立场是代码,为什么他们乘SUITS乘然后我添加t。令人困惑的是SUITS(相当于4),乘以i(13),然后加上j(其值为4),根本不等于52.所以请解释一下,这个函数是如何工作的。

+3

Maxmium值CURRENT_COLUMN开始是12,'j'为3 SO 4 * 12 + 3 = 51(阵列的第52值)。 – Mics

+0

我在C#中编写了类似的代码,只是通过在让你感到困惑的行后面的内部for循环中添加此行,让事情自我解释为Console.WriteLine(“deck [{0}] = {1}”,SUITS * i + j,甲板[SUITS * i + j]); (请将其转换为基于Java的输出为控制台(或命令提示符)...然后尝试了解.. –

+2

你应该访问http://codereview.stackexchange.com/ – zEro

回答

2

的索引“i”将用于索引是4采取值从0到12

+0

不是一个非常完整的答案。很明显pur3extrme ... –

+1

@ jesses.co.tt实际上它不是,如果你仔细看看这个问题,OP实际上会说我会是13.“乘以我(这是13),” – Sikorski

+0

@Sikorski fair足够的,你是对的,但sudopunk的答案仍然缺乏... –

5

你的变量i将只0和12中,并且j变量之间去将去0至3,所以最大值* 12 + 3 = 51,这是您的甲板的最大指数,这样的甲板将具有52个元素,使得感为一副牌。

2
// avoid hardwired constants 
    int SUITS = suit.length; 
    int RANKS = rank.length; 
    int N = SUITS * RANKS; 
    // initialize deck 
    String[] deck = new String[N]; 
    for (int i = 0; i < RANKS; i++) { 
     for (int j = 0; j < SUITS; j++) { 
      deck[SUITS * i + j] = rank[i] + " of " + suit[j]; 

     } 
    } 

SUITS具有为4的长度,RANKS具有长度为12的,和N的大小为52(意味着字符串[]甲板上有52个位置)

因此,int i = 0; i < RANKS; i++将去从0到12,并且将int j = 0; j < SUITS; j++从0到3。

因此,4 * 12 + 3是51 - 或卡52

+0

我拿出SUITS * 1 + j并换成52;它给了我一个错误,是他们的区别? – pur3extrme

+0

@ pur3extme对不起,我的代表数学不好。数组中有52个位置 - 但是数组是0-索引的,所以51是你可以使用的最大位置,我将编辑我的文章。 – Singular1ty

+0

它仍然给me null – pur3extrme

4

这是一个常见的成语把一个事物的二维数组为一维数组通过这样的事情:

for (row = 0; row < ROWS; ++row) { 
    for (col = 0; col < COLUMNS; ++col) { 
     array[row * ROWSIZE + col] = . . . 
    } 
} 

这就是所谓的在展开矩阵“行主要命令“,即每一行i在开始下一行之前填充。而不是实际的行标记,每一行从行号*行大小(行大小只是列数)开始在1D数组中。使用“ROWSIZE”而不是“COLUMNS”使代码更清晰。

你也可以做到这一点在“列优先顺序”,像这样:

. . . array[col * ROWS + row] = . . . 

比方说,你有3行4列。第一个代码将填补数组是这样的:

0 1 2 3 4 5 6 7 8 9 10 11 

后者将填补数组是这样的:

0 4 8 1 5 9 2 6 10 3 7 11 

...但由于他做的非常接下来的事情就是洗牌的阵列,它并不重要的是它创建的顺序。

顺便说一句,使用字符串卡是一个可怕的想法。检出representing playing cards in software

+0

我对你提到的主要订单很感兴趣,但我不能将你的主要订单公式与提供的问题联系起来。如果我将西装和行列联系起来,那么你的公式不适合,反之亦然。在维基百科,行主要订单公式不同:行* COLUMNSIZE + col。你可以看看它还是把它与问题联系起来?无论如何+1解释算法。 – Sikorski

+0

我没有看到你提到的文字。我看到的Wikipedia文章说'offset = row * NUMCOLS + column',这是正确的。 (正如我所说的,“行大小”和“列数”是相同的东西)。 –

+0

哦,好的,我应该仔细阅读! – Sikorski

1

在洗牌之前;它基本上是一个线性阵列上的二维数组。

ARRAY[CURRENT_ROW][CURRENT_COLUMN] 

= ARRAY[(NUMBER_OF_COLUMNS * CURRENT_ROW) + CURRENT_COLUMN] 

凡指数CURRENT_ROW和从i`的'0