我得到了这段代码来分析:
private String type[] = {"Hearts","Spades","Clubs","Diamonds"};
private String rank[] = {"2","3","4","5","6","7","8","9","10","Jack","Queen","King","Ace"};
private String deck[] = new String[52];
private void createDeck(){
for (int i = 0; i < rank.length; i++){
for (int j = 0; j < type.length; j++){
deck[type.length*i + j] = rank[i]+type[j];
}
}
}这是一张扑克牌的简单模拟,我完全理解数组是如何工作的,并且是通过循环逻辑填充的。但是,我很难理解的是,数组索引是在哪里完成的:type.length*i + j
在分析这个输出的时候,很简单,每个循环的增量为1。太棒了。但是,出于对Java的热爱,我无法理解创建者是如何为一次递增1这样简单的事情制定这个公式的。
我不知道我在问什么..。这个简单公式背后的推理/逻辑是什么?当我面对类似的情况时,我能做些什么来获得这种直觉呢?从我的角度看,这似乎完全出乎我的意料。我对代数和微积分相当熟悉,但这不是我能用我所掌握的数学知识弄明白的。
谢谢。
发布于 2020-01-08 15:00:57
首先,让我们考虑将卡片添加到数组中的顺序。根据给定的代码,我们在级别上循环,对于每个级别,在转移到下一个级别之前,遍历所有类型。所以命令是:
1的心,1的黑桃,1的俱乐部,1颗钻石,2颗心,.
既然我们知道我们要按什么顺序添加卡片,那么我们如何知道一张卡片的索引,考虑到它的排名和类型?
我们按顺序排列每个等级的4张卡片:4张1级的卡片,然后是4张2级的卡片,4张3级的卡片,等等。例如,在至少6*4 = 24张卡之后,应该添加8级的卡片,加上一些偏移量的。这种偏移取决于卡的类型。
差不多就是这样了!如果将i作为级别的索引,j作为西装的索引,我们就可以得到给定卡的索引是:
type.length*i + j发布于 2020-01-08 15:02:56
一个简单的方法是,它是相反的应用除法(/)和余数(%)运算符。
i = 34 / type.length = 34 / 4 = 8
j = 34 % type.length = 34 % 4 = 2所以倒车你会得到
34 = type.length * i + j这导致了
deck[type.length * i + j] = rank[i] + type[j]
deck[34] = rank[8] + type[2]发布于 2020-01-08 15:44:24
这是一个线性化的4* 13笛卡儿乘积(二维值)在一个阵列52个元素。
i*4步进4,j取0,1,2,3,所以实际的索引从0到52-1。
附带说明:
private String type[]是C兼容的语法(来自Java早期)。正常情况是:
private String[] typehttps://stackoverflow.com/questions/59648257
复制相似问题