Рассуждение / Интуиция за формулой индекса - PullRequest
0 голосов
/ 08 января 2020

Мне дали этот фрагмент кода для анализа:

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];
        }
    }
}

Это простая симуляция колоды карт, и я полностью понимаю, как работают массивы и заполняются через циклический лог c. Однако мне трудно понять, где интуиция и аргументы в пользу того, как выполняется индексация массива: type.length*i + j

После анализа результатов этого достаточно просто, вы получаете приращения 1 для каждый л oop вокруг. Отлично. Но я не могу из-за любви к Java понять, как создатель пришел, чтобы сформулировать эту формулу для чего-то такого простого, как увеличение на 1 каждый раз.

Я не уверен, о чем я здесь спрашиваю. .. в чем причина / логика c за этой простой формулой? Что я могу сделать, чтобы получить такую ​​интуицию в подобных ситуациях? Это просто кажется совершенно неожиданным с моей точки зрения. Я довольно хорошо знаком с алгеброй и исчислением, но это не то, что я мог бы выяснить с помощью математических знаний, которые у меня есть.

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 января 2020

Один простой способ взглянуть на это состоит в том, что это обратное применение операторов деления (/) и остатка (%).

   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]

1 голос
/ 08 января 2020

Это линеаризация 4 * 13 декартовых произведений (двумерных значений) в одном массиве из 52 элементов.

i*4 идет с шагом 4, а j занимает 0, 1, 2 , 3. Таким образом, фактический индекс идет с шагом от 0 до 52-1.

Примечание:

private String type[]

- это C совместимый синтаксис (с ранних дней Java). Нормальным будет:

private String[] type
1 голос
/ 08 января 2020

Сначала давайте рассмотрим порядок, в котором карты добавляются в массив. Основываясь на данном коде, мы перебираем ранги и для каждого ранга перебираем все типы, прежде чем перейти к следующему рангу. Итак, порядок:

1 червей, 1 пиков, 1 булав, 1 бубнов, 2 черв, ...

Теперь, когда мы знаем в каком порядке мы хотим добавить карты, как мы узнаем индекс карты с учетом ее ранга и типа?

В нашем распоряжении по 4 карты каждого ранга: 4 карты ранга 1, за которыми следуют 4 карты ранг 2, 4 карты ранга 3 и т. д. Так, например, карта ранга 8 должна быть добавлена ​​после, по крайней мере, 6 * 4 = 24 карт, плюс некоторое смещение . И это смещение зависит от типа карты.

И это во многом! Имея i как индекс рангов и j как один для мастей, мы получаем, что индекс данной карты:

type.length*i + j
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...