arrays - for - ¿Cómo inicializar una matriz en Kotlin con valores?
when function kotlin (16)
En Java, se puede inicializar una matriz como:
int numbers[] = new int[] {10, 20, 30, 40, 50}
¿Cómo se ve la inicialización de la matriz de Kotlin?
Antigua pregunta, pero si desea utilizar un rango:
var numbers: IntArray = IntRange(10, 50).step(10).toList().toIntArray()
Produce casi el mismo resultado que:
var numbers = Array(5, { i -> i*10 + 10 })
resultado: 10, 20, 30, 40, 50
Creo que la primera opción es un poco más legible. Ambos trabajan.
Aquí hay un ejemplo:
fun main(args: Array<String>) {
val arr = arrayOf(1, 2, 3);
for (item in arr) {
println(item);
}
}
También puede usar un playground de playground para probar las características del lenguaje.
Creo que una cosa que vale la pena mencionar y que no es lo suficientemente intuitiva de la documentación es que, cuando usa una función de fábrica para crear una matriz y especifica su tamaño, la matriz se inicializa con valores que son iguales a sus valores de índice.
Por ejemplo, en una matriz como esta:
val array = Array(5, { i -> i })
, los valores iniciales asignados son
[0,1,2,3,4]
y no decir,
[0,0,0,0,0]
.
Es por eso que de la documentación,
val asc = Array(5, { i -> (i * i).toString() })
produce una respuesta de
["0", "1", "4", "9", "16"]
Declarar int array en global
val array: Array<Int> = [1, 2, 3]
El siguiente método onCreate inicializa tu matriz con valor
@Option( name = "-h", aliases = ["--help", "-?"], usage = "Show this help" ) var help: Boolean = false
El lenguaje Kotlin tiene clases especializadas para representar matrices de tipos primitivos sin sobrecarga de boxeo: por ejemplo:
IntArray
,
ShortArray
,
ByteArray
, etc. Necesito decir que estas clases no tienen relación de herencia con la clase matriz
Array
, pero tienen el mismo conjunto de métodos y propiedades.
Cada uno de ellos también tiene una función de fábrica correspondiente.
Entonces, para inicializar una matriz con valores en Kotlin solo necesita escribir esto:
val myArr: IntArray = intArrayOf(10, 20, 30, 40, 50)
... o de esta manera:
val myArr = Array<Int>(5, { i -> ((i+1) * 10) })
myArr.forEach { println(it) } // 10, 20, 30, 40, 50
Ahora puedes usarlo:
myArr[0] = (myArr[1] + myArr[2]) - myArr[3]
Espero que esto ayude.
En Kotlin hay varias formas.
var arr = IntArray(size) // construct with only size
Luego, simplemente el valor inicial de los usuarios o de otra colección o donde quieras.
var arr = IntArray(size, { 0 } ) // construct with size and fill array with 0
var arr = IntArray(size, { it * 1 } ) // construct with size and fill with its index
También podemos crear una matriz con funciones integradas como:
var arr = intArrayOf(1, 2, 3, 4, 5) // create an array with 5 values
De otra manera
var arr = Array(size, { 0 } ) // it will create an integer array
var arr = Array<String>(size, { "$it" } ) // this will create array with "0", "1", "2" and so on.
También puede usar
doubleArrayOf()
o
DoubleArray()
o cualquier tipo primitivo en lugar de Int.
En Kotlin podemos crear una matriz usando las
arrayOf()
,
intArrayOf()
,
charArrayOf()
,
booleanArrayOf()
,
longArrayOf()
.
Por ejemplo:
var Arr1 = arrayOf(1,10,4,6,15)
var Arr2 = arrayOf<Int>(1,10,4,6,15)
var Arr3 = arrayOf<String>("Surat","Mumbai","Rajkot")
var Arr4 = arrayOf(1,10,4, "Ajay","Prakesh")
var Arr5: IntArray = intArrayOf(5,10,15,20)
En mi caso, necesito inicializar mis elementos del cajón. Completo los datos con el siguiente código.
var numbers= intArrayOf()
Clase de modelo personalizado
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//create your int array here
numbers= intArrayOf(10,20,30,40,50)
}
Puede crear una Matriz Int como esta:
val numbers = IntArray(5, { 10 * (it + 1) })
5 es el tamaño de la matriz Int. la función lambda es la función init del elemento. rango ''it'' en [0,4], más 1 rango de marca en [1,5]
la función de origen es:
/**
* An array of ints. When targeting the JVM, instances of this class are
* represented as `int[]`.
* @constructor Creates a new array of the specified [size], with all elements
* initialized to zero.
*/
public class IntArray(size: Int) {
/**
* Creates a new array of the specified [size], where each element is
* calculated by calling the specified
* [init] function. The [init] function returns an array element given
* its index.
*/
public inline constructor(size: Int, init: (Int) -> Int)
...
}
Clase IntArray definida en Arrays.kt
Puedes probar esto:
var a = Array<Int>(5){0}
Simplemente puede usar los methods biblioteca estándar existentes como se muestra aquí:
val numbers = intArrayOf(10, 20, 30, 40, 50)
Sin embargo, podría tener sentido usar un constructor especial:
val numbers2 = IntArray(5) { (it + 1) * 10 }
Pasa un tamaño y una lambda que describe cómo iniciar los valores. Aquí está la documentación:
/**
* Creates a new array of the specified [size], where each element is calculated by calling the specified
* [init] function. The [init] function returns an array element given its index.
*/
public inline constructor(size: Int, init: (Int) -> Int)
Vale la pena mencionar que cuando se usan los paquetes de kotlin (por ejemplo,
intArrayOf()
,
longArrayOf()
,
arrayOf()
, etc.) no puede inicializar la matriz con los valores predeterminados (o todos los valores al valor deseado) para un tamaño dado, en cambio necesita hacer inicializar mediante llamadas de acuerdo con el constructor de la clase.
// Array of integers of a size of N
val arr = IntArray(N)
// Array of integers of a size of N initialized with a default value of 2
val arr = IntArray(N) { i -> 2 }
intialize array de esta manera:
val paramValueList : Array<String?> = arrayOfNulls<String>(5)
puedes usar estos métodos
var numbers=Array<Int>(size,init)
var numbers=IntArray(size,init)
var numbers= intArrayOf(1,2,3)
ejemplo
var numbers = Array<Int>(5, { i -> 0 })
init representa el valor predeterminado (inicializar)
Me pregunto por qué nadie acaba de dar la respuesta más simple:
val iconsArr : IntArray = resources.getIntArray(R.array.navigation_drawer_items_icon)
val names : Array<String> = resources.getStringArray(R.array.navigation_drawer_items_name)
// Use lambda function to add data in my custom model class i.e. DrawerItem
val drawerItems = Array<DrawerItem>(iconsArr.size, init =
{ index -> DrawerItem(iconsArr[index], names[index])})
Log.d(LOGGER_TAG, "Number of items in drawer is: "+ drawerItems.size)
Según uno de los comentarios a mi respuesta original, me di cuenta de que esto solo funciona cuando se usa en argumentos de anotaciones (lo cual fue realmente inesperado para mí).
Parece que Kotlin no permite crear literales de matriz fuera de las anotaciones.
Por ejemplo, mire este código usando @Option de la biblioteca args4j:
class DrawerItem(var icon: Int, var name: String) {
}
El argumento de opción "alias" es de tipo
Array<String>
val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50)
Ver kotlinlang.org/docs/reference/basic-types.html para más detalles.