En este tutorial discutiremos sobre el uso de Arrays en Kotlin con el fin de representar vectores (arreglos) en nuestras aplicaciones. Verás cómo crearlos, el acceso y modificación de sus elementos, y como recorrerlos.
Crear Arrays
Un arreglo es una estructura con valores de datos, que están almacenados de forma contigua en memoria. Todos los elementos son referenciados por un mismo nombre y tienen el mismo tipo de dato.
Los elementos estarán indexados tomando como base el 0 y el tamaño declarado del arreglo será fijo.
Kotlin usa la clase genérica Array<T>
para representar arreglos. Crear instancias con un tipo parametrizado usa los siguientes métodos:
arrayOf(vararg elements:T)
: recibe un argumento variables con elementos de tipo T y retorna el arreglo que los contiene.arrayOfNulls(size:Int)
: crea un arreglo de tamañosize
con elementos de tipoT
e inicializa los valores connull
emptyArray()
: crear un arreglo vacío con el tipoT
Por ejemplo:
Considera que necesitas almacenar el valor de los ingresos de 12 meses del usuario. En vez de crear 12 variables para cada mes (januaryIncome
, febrauryIncome
, etc.) optas por crear un arreglo con estos elementos:
val income = arrayOf<Double>(
0.5, 2.5, 4.0, 5.0,
4.5, 6.0, 7.6, 8.0,
5.0, 6.4, 4.0, 9.1
)
Al igual que cualquier declaración de instancias, puedes omitir el tipo parametrizado <Double>
porque el compilador de Kotlin puede inferirlo.
Usar Constructor Array()
Si deseas crear un array con un tamaño especifico y calcular todos sus elementos a partir de una función, entonces usa el constructor Array(size, init)
.
Por ejemplo, creemos un array que contenga los número del 1 al 10 con signo negativo:
fun main() {
val negativeNumbers = Array(10) { -(it + 1) }
println(negativeNumbers.joinToString())
}
Salida:
-1, -2, -3, -4, -5, -6, -7, -8, -9, -10
El segundo parámetro init
de Array()
es del tipo función Int -> T
, donde el parámetro entero es el índice y el cuerpo la expresión que calcula el valor del elemento. Por esto pasamos la función lambda { -(it + 1) }
.
La función joinToString()
permite crear un String legible para imprimir. Aunque también puedes usar contentToString()
.
println(negativeNumbers.contentToString())
// [-1, -2, -3, -4, -5, -6, -7, -8, -9, -10]
Acceso A Elementos
La clase Array
te provee operadores set()
y get()
para asignar y obtener valores en los índices de tus arreglos. Sin embargo, es preferible usar el operador de acceso indexado [ ]
para referirte a los elementos.
fun main() {
val planets = arrayOfNulls<String>(8)
planets[0] = "Mercurio"
planets[1] = "Venus"
planets[2] = "Tierra"
planets[3] = "Júpiter"
planets[4] = "Saturno"
planets[5] = "Urano"
planets[6] = "Neptuno"
planets[7] = "Plutón"
println(planets.contentToString())
}
Salida:
[Mercurio, Venus, Tierra, Júpiter, Saturno, Urano, Neptuno, Plutón]
Como ves, la asignación a cada posición del array de planetas se realiza con los índices en corchetes. La tierra como está en la posición 3 sería asignada con [2]
.
Recorrer Arrays
Una de las formas más convencionales de recorrer arreglos es a través del bucle for a través del operador in
junto a la propiedad de extensión indices
. Esta contiene el rango válido de los índices del array.
Retomemos el ejemplo anterior de planetas. Si quisiéramos imprimir cada línea con la posición y el bucle para recorrerlo se vería así:
fun main() {
val planets = arrayOfNulls<String>(8)
planets[0] = "Mercurio"
planets[1] = "Venus"
planets[2] = "Tierra"
planets[3] = "Júpiter"
planets[4] = "Saturno"
planets[5] = "Urano"
planets[6] = "Neptuno"
planets[7] = "Plutón"
for(i in planets.indices){
println("${planets[i]} está en la posición ${i+1}")
}
}
Salida:
Mercurio está en la posición 1
Venus está en la posición 2
Tierra está en la posición 3
Júpiter está en la posición 4
Saturno está en la posición 5
Urano está en la posición 6
Neptuno está en la posición 7
Plutón está en la posición 8
Ahora, también es posible usar el atributo size
del mismo array:
for (i in 0 until planets.size) {
println("${planets[i]} está en la posición ${i + 1}")
}
Otra opción es usar la función de extensión forEachIndexed()
, la cual recibe como parámetros el índice y el valor, y te permite imprimir en el cuerpo:
planets.forEachIndexed { i, v ->
println("$v está en la posición ${i+1}")
}