Kotlin. Массивы

Kotlin. Массивы

E-code
И где теперь ваш ассемблер?
Larry Wall

Забрасывали ли Вы когда-нибудь тысячу вещей в шкаф перед приходом гостей, чтобы создать иллюзию чистоты в Вашей комнате? Наверняка да. И сегодня настал день, когда пора прибраться в нашем страшном коде, забросив миллионы миллиардов переменных (если этот мир абсолютно понятен) в особое место, называемое массивом!


Массивы

Давайте представим, что Вы обычный программист (знаю, это невероятно сложно, но всё же) какого-то маленького университета, с которым связано много классных историй из вашей жизни. И сегодня ваш босс сказал Вам, что три сотни тараканов (*звуки заводящегося трактора) хотят заселиться в ваше общежитие, и срочно нужно записать их имена и фамилии.


Думаю, Вы уже наготовились жать Ctrl+C и Ctrl+V для создания трех сотен переменных, но не спешите ломать клавиатуру, ведь можно воспользоваться массивами, которые позволяют хранить в себе последовательность элементов.

Массивы позволяют сохранять в себе набор значений одного типа данных.

Спросите как пользоваться этой штуковиной? Да я и сам не знаю. Но ходят слухи, что создавать массивы можно почти также как обычные переменные, указав в качестве типа данных Array<типДанныхЭлементаМассива>:

Создаем пустой массивчик наших первокурсников-тараканов

Причем инициализировать (это умное слово означает "задать начальное значение") этот массивчик можно с помощью команды arrayOf():

Шняга-шняжная. Теперь у тараканов есть имена!

Окей, мы создали последовательность тараканов, закинув их в наше общежитие. Теперь можно спокойно пить чай, слушая инстасамку, ведь вся работа сделана!

Но босса так просто не остановить. Он хочет отдельно вызывать каждого таракана в себе в кабинет, чтобы подписать с ним договор о проживании. Как мы можем обратиться к конкретному элементу массива (конкретному таракану), выведя его на экран?

ЧЕ У ВАС ЗДЕСЬ ПРОИСХОДИТ?

Для этой задачи используются индексы, которые нумеруют каждый элемент последовательности в нашем массиве.

С помощью индексов мы можем обратиться к определенному элементу в массиве

То есть, чтобы мы хоть как-то могли доставать нужный элемент из N заброшенных элементов в массиве (речь идет не только о трехзначных суммах), были созданы индексы, которые дают каждому элементу уникальный номер, называемый индексом.

Пример массива из 5 чисел и индексов этих элементов


Индексация всегда начинается с нуля. То есть первый элемент имеет индекс 0, второй - 1, третий - 2 и т.д. Об этом часто забывают, как друг забывает о долге, поэтому если Вы запомните эту простую истину, то программирование займет первое (или нулевое?) место в Вашей жизни!

И теперь, для того, чтобы обратиться к конкретному элементу, достаточно указать в [квадратных скобках] после имени массива его индекс:

Обращаемся к конкретным тараканам
Вот они: слева-направо


А что делать, если мы захотим изменить имя нашему таракану? Как изменить значение конкретного элемента массива?

Сделать это проще простого: достаточно просто обратиться к определенному элементу, поставить знак "=" и присвоить новое значение:

Петька был хорошим усатым...


Теперь, почувствовав себя настоящим комендантом, Вы, наверняка, захотите добавить нового таракана себе в общежитие или выселить его оттуда, удалив элемент из массива. Но попробовав сделать это, Вы столкнетесь (с диким матом Kotlin'а) с некоторыми трудностями, связанными с особенностями массивов.


Особенности массива

Каждый массив обладает двумя характерными особенностями, которые позволяют ему быстро работать (за бесплатно в том числе):

  1. Массив имеет фиксированный размер.
    То есть, если Вы создали массив на 10 элементов, то там всегда будет 10 элементов. Вы не сможете добавить 11-ый элемент, или удалить 10-ый. Придется смириться с этим, продолжая работать только с операциями взятия и изменения элементов массива
  2. Каждый элемент массива может быть только одного типа данных.
    Даже если это тип данных Any. Если мы создали массив целых чисел, то в нем могут храниться только целые числа, если массив строк - то только строки. Это позволяет нашим массивам быстрее работать с элементами.
Когда создал массив типа Any


Да, кстати, никто не запрещает вам создавать пустые массивы в Вашем коде, только зачем? (Ходят слухи, что пустой массив в коде - это к увольнению. Увольнению вашего тимлида).

БЕЗУМНО МОЖНО БЫТЬ ПЕЕЕЕРВЫМ


Почему существуют эти ограничения?

Дело всё в том, что создавая массив, в виртуальной памяти вашего компьютера выделяется подряд идущие ячейки памяти для заданного массива. Поэтому никто не дает гарантий (как и гарантийного срока), что Вы сможете в дальнейшем добавить следующую подряд идущую ячейку памяти (а вдруг её займет другая переменная с другим тараканом?).

Например, если Вы создаете целочисленный (int) массив из 5-ти элементов, то на это понадобится 4 байта * 5 = 20 байт оперативной памяти. Причем такой механизм работы с памятью позволяет всего за 1 операцию получать и изменять элементы массива.

Если мы знаем ячейку памяти, с которой начинается массив, сколько байт занимает 1 ячейка (тип данных) и индекс необходимого элемента, то мы можем с легкостью вычислить адрес ячейки памяти с нужным элементом (adress = start_adress + index*size_elem).

Каждая ячейка - 1 байт



Двумерные массивы

А что будет, если поместить массив в массив?


Кто-то скажет что Вселенная схлопнется. Но мы же уверены, что элементом каждого массива будет просто... массив.

Двумерный массив - это массив, каждый элемент которого является массивом

Посмотрим на это безобразие в коде:

Что является каждым элементом массива myArray? Очевидно, что массивы:

Массив тоже может быть элементом массива

На самом деле, эти массивы очень похожи на строки таблицы (например Excel). И получается, что каждый элемент двумерного массива (таблицы) - это всего лишь строка, представленная в виде другого массивчика.

Чтобы взять конкретный элемент данной строки, мы можем второй раз с помощью индекса обратиться к выбранному масиву (строке):


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

имяМассива[номерСтроки][номер столбца] - конкретный элемент таблицы (двумерного массива)
имяМассива[номерСтроки] - конкретная строка (массив) таблицы (двумерного массива)

А теперь примите поздравления, Вы только что изучили одну из самых тем для новичков в программировании!


Когда нужен массив?

На реальной практике массив применяется во многих случаях, когда мы работаем с последовательностью объектов строго фиксированного размера.

Например, открою для Вас секрет, любое изображение - это всего лишь двумерный массив чисел, где каждое число обозначает отдельный пиксель на данной фотографии. А за счет того, что доступ к элементам массивами весьма быстрый, то это отлично подойдет для реализации программ, работающими с изображениями (наложение фильтров на картинки, компьютерное зрение и т.д.).

Этот пример далеко не единственный, и Вы скоро сами поймете, как часто нужны Вам массивы в Вашем коде.


Что дальше?

В следующей статье мы поговорим, как запускать повторяющийся код с помощью циклов. А также узнаем, как анализировать большие массивы данных с помощью тех же циклов.


Дорогой читатель, я надеюсь моя статья оказалась полезной для тебя!

Ты всегда можешь следить за моим творчеством на этом канале.

Спасибо за проявленный интерес!

Report Page