Kotlin: how to create a 2D Array of the type String
i am learning kotlin. i need to create a 2D array which can hold words , special chars and numbers .some where i found this piece of code THIS The problem with this is that it can hold only Int . When i tried replacing keyword «IntArray» with «string». it returned an error ERROR Can someone help me create a 10×8 Arrray which can hold strings in Kotlin
3 Answers 3
There’s no StringArray in Kotlin (here’s an explanation why), use Array instead.
If you can provide the array items as you create the arrays, then creating the array can be done as:
val result = Array(10) < i ->Array(8) < j ->"the String at position $i, $j" // provide some initial value based on i and j > > println(result[0][3]) // Prints: the String at position 0, 3
Otherwise, you can either use some default String value:
Or create the inner arrays filled with null values (note: you will have to deal with nullability, you won’t be able to use the items as non-null values):
val result = Array(10) < arrayOfNulls(8) > // The type is `Array> result[0][0] = "abc" println(result[0][0]. reversed()) // Without `!!`, the value is treated as not-safe-to-use
You can also use Array> . Note that the compiler can automatically infer this type, but specifying the type may help you understand better what’s going on. Here is an example with output:
fun main() < // Create the 2D array of Strings val string2DArray: Array> = arrayOf( arrayOf("apple", "orange", "avocado", "mango", "banana"), arrayOf("_", "!", ":", "?"), arrayOf("1", "2", "3", "4", "5", "10")) // Print the 2D array string2DArray.forEach < it.forEach < it ->print("$it, ") > println() > // Access an individual String using index notation. println("My favorite fruit is: $") >
apple, orange, avocado, mango, banana, _, !, :, ?, 1, 2, 3, 4, 5, 10, My favorite fruit is: avocado
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) пробегаемся по всем элементам двухмерного массива, то есть по строкам таблицы. Каждый из элементов двухмерного массива сам представляет массив, поэтому мы можем пробежаться по этому массиву и получить из него непосредственно те значения, которые в нем хранятся. В итоге на консоль будет выведено следующее: