首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引公式背后的推理/直觉

索引公式背后的推理/直觉
EN

Stack Overflow用户
提问于 2020-01-08 14:43:51
回答 3查看 60关注 0票数 0

我得到了这段代码来分析:

代码语言:javascript
复制
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这样简单的事情制定这个公式的。

我不知道我在问什么..。这个简单公式背后的推理/逻辑是什么?当我面对类似的情况时,我能做些什么来获得这种直觉呢?从我的角度看,这似乎完全出乎我的意料。我对代数和微积分相当熟悉,但这不是我能用我所掌握的数学知识弄明白的。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-08 15:00:57

首先,让我们考虑将卡片添加到数组中的顺序。根据给定的代码,我们在级别上循环,对于每个级别,在转移到下一个级别之前,遍历所有类型。所以命令是:

1的心,1的黑桃,1的俱乐部,1颗钻石,2颗心,.

既然我们知道我们要按什么顺序添加卡片,那么我们如何知道一张卡片的索引,考虑到它的排名和类型?

我们按顺序排列每个等级的4张卡片:4张1级的卡片,然后是4张2级的卡片,4张3级的卡片,等等。例如,在至少6*4 = 24张卡之后,应该添加8级的卡片,加上一些偏移量的。这种偏移取决于卡的类型。

差不多就是这样了!如果将i作为级别的索引,j作为西装的索引,我们就可以得到给定卡的索引是:

代码语言:javascript
复制
type.length*i + j
票数 1
EN

Stack Overflow用户

发布于 2020-01-08 15:02:56

一个简单的方法是,它是相反的应用除法(/)和余数(%)运算符。

代码语言:javascript
复制
   i = 34 / type.length = 34 / 4 = 8
   j = 34 % type.length = 34 % 4 = 2

所以倒车你会得到

代码语言:javascript
复制
   34 = type.length * i + j

这导致了

代码语言:javascript
复制
   deck[type.length * i + j] = rank[i] + type[j]
   deck[34] = rank[8] + type[2]
票数 1
EN

Stack Overflow用户

发布于 2020-01-08 15:44:24

这是一个线性化的4* 13笛卡儿乘积(二维值)在一个阵列52个元素。

i*4步进4,j取0,1,2,3,所以实际的索引从0到52-1。

附带说明:

代码语言:javascript
复制
private String type[]

是C兼容的语法(来自Java早期)。正常情况是:

代码语言:javascript
复制
private String[] type
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59648257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档