- Kotlin: Многомерные массивы
- Предварительные условия
- Двумерные массивы в Kotlin
- Двумерные массивы с заранее определенными данными
- Двумерные массивы с динамическим размером
- N-мерные массивы в Kotlin
- Заключение
- Arrays
- Primitive type arrays
- Двумерный массив строк kotlin
- Перебор массивов
- Проверка наличия элемента в массиве
- Массивы для базовых типов
- Двухмерные массивы
Kotlin: Многомерные массивы
В какой-то момент времени все мы работали с массивами. Это полезная структура данных для хранения нескольких значений одного типа в одной переменной. Сложное использование массивов включает хранение данных в двумерных, трехмерных или других многомерных массивах. Это позволяет нам эффективно представлять такие вещи, как матрицы, сетки и кубы.
В этом руководстве мы сосредоточимся на объявлении, инициализации и использовании двумерных, трехмерных и других многомерных массивов в языке программирования Kotlin.
Предварительные условия
Чтобы понять многомерные массивы и списки в kotlin, необходимо иметь правильное представление о одномерных массивах. Я опубликовал интуитивно понятную статью о массивах в Kotlin, похожую на эту, прочитайте ее, прежде чем продолжить.
Двумерные массивы в Kotlin
Двумерные массивы — это удобный способ хранения данных типа сетка/доска/матрица.
Если углубиться в стандартную библиотеку Kotlin, то функция arrayOf() фактически возвращает Array , где T — тип элементов в массиве. Это означает, что если мы передаем T , то получаем массив Array .
Это означает, что если мы передаем arrayOf() в функцию arrayOf() , мы эффективно получаем Array> и это именно представление двумерных массивов!
Двумерные массивы с заранее определенными данными
Давайте посмотрим, как сделать двумерные массивы с заранее заданными значениями:
val array = arrayOf( arrayOf(1, 2, 3), arrayOf(4, 5, 6), arrayOf(7, 8, 9) )
Это создаст двумерный массив Kotlin, который является коллекцией одномерных массивов Kotlin. Вот представление массива:
General Form: [[1 2 3], [4,5,6], [7,8,9]] As a matrix: 1 2 3 4 5 6 7 8 9
Опять же, эти массивы не являются безопасными для типов данных. Вы можете добавить другой тип данных в массив без каких-либо проблем. Чтобы сделать его безопасным для типов, нам нужно объявить тип массива во время инициализации:
val array = arrayOfArrayInt>>( // Declaring the type gives error if data types are mixed arrayOf(1, 2, 3), arrayOf(4, 5, 6, "this string will give error"), arrayOf(7, 8, 9) )
Двумерные массивы с динамическим размером
Для создания двумерных списков, у которых нет фиксированного известного размера, мы используем объявление mutableListOf>() , где T — это тип данных, который мы ожидаем получить от внутренних списков. Мы не передаем никакого начального значения, потому что массив будет заполнен с помощью некоторой логики позже.
Давайте посмотрим на это в действии:
val list = mutableListOfMutableListInt>>() // The elements within the inner lists can be anything, the numbers below are just an example. // `repeat()` takes in a number and iterates from 0 to number-1 repeat(4) // `row` is a new row in the array val row = mutableListOfInt>() repeat(4) col -> // `col` is a new column in the row, ranges from 0 to 3 row += col > // Append the row to the array, can also use the `add()` function list += row > // for each list in the list, print its element in matrix form for(sublist in list) for (j in sublist.indices) print("$j ") > println() // new line after each row > /* You can also access particular elements like: list[0][0] -> First element of the first row or list.get(0).get(0) -> Same as above */
Этот код выводит следующее:
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
Таким образом, мы можем создавать динамические списки в kotlin в соответствии с нашими потребностями.
N-мерные массивы в Kotlin
Используя рассмотренные выше подходы, нетрудно создать 3D, 4D или даже более размерные массивы.
Если набор данных известен, можно использовать функцию arrayOf() , а если массив данных переменный, то для создания массивов можно использовать функции mutableListOf() .
Заключение
В этом уроке вы узнали о массивах и изменяемых списках в kotlin с помощью функций arrayOf() и mutableListOf() .
Эти функции помогут вам создавать массивы и списки данных любого типа в Kotlin, хранить значения и выполнять действия на основе этих данных.
Я надеюсь, что вы найдете этот учебник полезным. Поделитесь им со своими друзьями, которые начинают изучать kotlin!
Arrays
Arrays in Kotlin are represented by the Array class. It has get() and set() functions that turn into [] by operator overloading conventions, and the size property, along with other useful member functions:
To create an array, use the function arrayOf() and pass the item values to it, so that arrayOf(1, 2, 3) creates an array [1, 2, 3] . Alternatively, the arrayOfNulls() function can be used to create an array of a given size filled with null elements.
Another option is to use the Array constructor that takes the array size and the function that returns values of array elements given its index:
The [] operation stands for calls to member functions get() and set() .
Arrays in Kotlin are invariant. This means that Kotlin does not let us assign an Array to an Array , which prevents a possible runtime failure (but you can use Array , see Type Projections).
Primitive type arrays
Kotlin also has classes that represent arrays of primitive types without boxing overhead: ByteArray , ShortArray , IntArray , and so on. These classes have no inheritance relation to the Array class, but they have the same set of methods and properties. Each of them also has a corresponding factory function:
// Array of int of size 5 with values [0, 0, 0, 0, 0] val arr = IntArray(5) // Example of initializing the values in the array with a constant // Array of int of size 5 with values [42, 42, 42, 42, 42] val arr = IntArray(5) < 42 >// Example of initializing the values in the array using a lambda // Array of int of size 5 with values [0, 1, 2, 3, 4] (values initialized to their index value) var arr = IntArray(5) < it * 1 >
Двумерный массив строк kotlin
Для хранения набора значений в Kotlin, как и в других языках программирования, можно использовать массивы . При этом массив может хранить данные только одного того же типа. В Kotlin массивы представлены типом Array .
При определении массива после типа Array в угловых скобках необходимо указать, объекты какого типа могут храниться в массиве. Например, определим массив целых чисел:
С помощью встроенной функции arrayOf() можно передать набор значений, которые будут составлять массив:
val numbers: Array = arrayOf(1, 2, 3, 4, 5)
То есть в данном случае в массиве 5 чисел от 1 до 5.
С помощью индексов мы можем обратиться к определенному элементу в массиве. Индексация начинается с нуля, то есть первый элемент будет иметь индекс 0. Индекс указывается в квадратных скобках:
val numbers: Array = arrayOf(1, 2, 3, 4, 5) val n = numbers[1] // получаем второй элемент n=2 numbers[2] = 7 // переустанавливаем третий элемент println("numbers[2] = $") // numbers[2] = 7
Также инициализировать массив значениями можно следующим способом:
val numbers = Array(3, ) // [5, 5, 5]
Здесь применяется конструктор класса Array. В этот конструктор передаются два параметра. Первый параметр указывает, сколько элементов будет в массиве. В данном случае 3 элемента. Второй параметр представляет выражение, которое генерирует элементы массива. Оно заключается в фигурные скобки. В данном случае в фигурных скобках стоит число 5, то есть все элементы массива будут представлять число 5. Таким образом, массив будет состоять из трех пятерок.
Но выражение, которое создает элементы массива, может быть и более сложным. Например:
var i = 1; val numbers = Array(3, < i++ * 2>) // [2, 4, 6]
В данном случае элемент массива является результатом умножения переменной i на 2. При этом при каждом обращении к переменой i ее значение увеличивается на единицу.
Перебор массивов
Для перебора массивов можно применять цикл for :
В данном случае переменная numbers представляет массив чисел. При переборе этого массива в цикле каждый его элемент оказывается в переменной number , значение которой, к примеру, можно вывести на консоль. Консольный вывод программы:
Подобным образом можно перебирать массивы и других типов:
Консольный вывод программы:
Можно применять и другие типы циклов для перебора массива. Например, используем цикл while :
Здесь определена дополнительная переменная i , которая представляет индекс элемента массива. У массива есть специальное свойство indices , которое содержит набор всех индексов. А выражение i in people.indices возвращает true, если значение переменной i входит в набор индексов массива.
В самом цикле по индексу обащаемся к элементу массива: println(people[i]) . И затем переходим к следующему индексу, увеличивая счетчик: i++ .
То же самое мы могли написать с помощью цикла for:
Проверка наличия элемента в массиве
Как и в случае с последовательностью мы можем проверить наличие или отсутствие элементов в массиве с помощью операторов in и !in :
val numbers: Array = arrayOf(1, 2, 3, 4, 5) println(4 in numbers) // true println(2 !in numbers) // false
Массивы для базовых типов
Для упрощения создания массива в Kotlin определены дополнительные типы BooleanArray , ByteArray , ShortArray , IntArray , LongArray , CharArray , FloatArray и DoubleArray , которые позволяют создавать массивы для определенных типов. Например, тип IntArray позволяет определить массив объектов Int , а DoubleArray — массив объектов Double :
val numbers: IntArray = intArrayOf(1, 2, 3, 4, 5) val doubles: DoubleArray = doubleArrayOf(2.4, 4.5, 1.2)
Для определения данных для этих массивов можно применять функции, которые начинаются на название типа в нижнем регистре, например, int , и затем идет ArrayOf .
Аналогично для инициализации подобных массивов также можно применять конструктор соответствуюшего класса:
val numbers = IntArray(3, ) val doubles = DoubleArray(3, )
Двухмерные массивы
Выше рассматривались одномерные массивы, которые можно представить в виде ряда или строки значений. Но кроме того, мы можем использовать многомерные массивы. К примеру, возьмем двухмерный массив — то есть такой массив, каждый элемент которого в свою очередь сам является массивом. Двухмерный массив еще можно представить в виде таблицы, где каждая строка — это отдельный массив, а ячейки строки — это элементы вложенного массива.
Определение двухмерных массивов менее интуитивно понятно и может вызывать сложности. Например, двухмерный массив чисел:
В данном случае двухмерный массив будет иметь три элемента — три строки. Каждая строка будет иметь по пять элементов, каждый из которых равен 0.
Используя индексы, можно обращаться к подмассивам в подобном массиве, в том числе переустанавливать их значения:
val table = Array(3, < Array(3, ) >) table[0] = arrayOf(1, 2, 3) // первая строка таблицы table[1] = arrayOf(4, 5, 6) // вторая строка таблицы table[2] = arrayOf(7, 8, 9) // третья строка таблицы
Для обращения к элементам подмассивов двухмерного массива необходимы два индекса. По первому индексу идет получение строки, а по второму индексу — столбца в рамках этой строки:
val table = Array(3, < Array(3, ) >) table[0][1] = 6 // второй элемент первой строки val n = table[0][1] // n = 6
Используя два цикла, можно перебирать двухмерные массивы:
fun main() < val table: Array> = Array(3, < Array(3, ) >) table[0] = arrayOf(1, 2, 3) table[1] = arrayOf(4, 5, 6) table[2] = arrayOf(7, 8, 9) for(row in table) < for(cell in row)< print("$cell \t") >println() > >
С помощью внешнего цикла for(row in table) пробегаемся по всем элементам двухмерного массива, то есть по строкам таблицы. Каждый из элементов двухмерного массива сам представляет массив, поэтому мы можем пробежаться по этому массиву и получить из него непосредственно те значения, которые в нем хранятся. В итоге на консоль будет выведено следующее: