¿Cómo inicializar una matriz en Kotlin con valores?

261

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?

Lars Blumberg
fuente
Tal vez solo eche un vistazo a los documentos: kotlinlang.org/docs/reference/basic-types.html
khlr
66
La documentación oculta algo la respuesta. En lugar de dar un ejemplo de código fuente, mencionan la función (en desuso) array()en un comentario lateral: para crear una matriz, podemos usar una matriz de función de biblioteca () y pasarle los valores del elemento, de modo que esa matriz (1, 2, 3 ) crea una matriz [1, 2, 3].
Lars Blumberg
8
Aunque me gusta Kotlin pero he dicho que "la documentación de Kotlin" no es lo suficientemente buena (aprendí más de otros sitios que kotlinlang.org).
Hassan Tareq
1
Además, en algún momento solo quieres un intRange que puedas hacer: lo val numbers = 1..5que da un rango int de 1 a 5.
Sylhare

Respuestas:

313
val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50)

Ver Kotlin - Tipos básicos para más detalles.

También puede proporcionar una función de inicializador como segundo parámetro:

val numbers = IntArray(5) { 10 * (it + 1) }
// [10, 20, 30, 40, 50]
Maroun
fuente
99
¿Es preferible usar intArrayOfmás arrayOf? Por lo tanto IntArraytiene ventajas más Array<Int>?
Lars Blumberg
17
@LarsBlumberg IntArray es igual a int [], Array <Int> es lo mismo que Integer []
user2235698
3
Inicializar una lista es muy similar:listOf(10, 20, 30, 40, 50)
Cristan
Cuando estoy usando la función intArrayOf (), me enfrento Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage. Estoy usando jdk1.8.0_241e Intellij IDEA
TeachMeJava
92

Cabe mencionar que cuando se utiliza builtines Kotlin (por ejemplo intArrayOf(), longArrayOf(), arrayOf(), etc.) no es capaz de inicializar la matriz con los valores por defecto (o todos los valores a valor deseado) para un tamaño dado, en lugar que necesita hacer initialize a través de llamar según 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 }
vtor
fuente
99
¡Ese segundo valor predeterminado init usando el lambda fue muy útil! Gracias
rf43
99
La segunda forma de inicialización se puede escribir como: IntArray(N) {i -> 2}e incluso (cuando se inicializa con una constante)IntArray(N) {2}
David Soroko
1
En lugar de i podemos usar "_" var arr = IntArray (N) {_ -> false}
Navas pk
1
Ese con el lambda era exactamente lo que necesitaba para iniciar una matriz con un tamaño dinámico y un valor predeterminado no opcional. ¡Gracias!
mithunc
48

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 patio de juegos para evaluar las características del lenguaje.

sombra
fuente
3
Un comentario, para imprimir el valor de una matriz, podemos usar array.joinToString ("") en lugar de bucle.
anticafe
2
Funciona pero parece más Java escrito en Kotlin que Kotlin idiomático :)
m0skit0
47

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} // 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()cualquier tipo primitivo en lugar de Int.

HM Nayem
fuente
var arr = IntArray(size, { it * 1 } )es lo mismo quevar arr = IntArray(size){it}
Det
30

En Kotlin podemos crear matriz utilizando arrayOf(), intArrayOf(), charArrayOf(), booleanArrayOf(), longArrayOf()funciones.

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)  
RS Patel
fuente
Vuelva a formatear esta respuesta para que quede claro qué es el código y qué es el comentario.
6

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.

Brooks DuBois
fuente
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)

Ali hasan
fuente
1
Ayuda si da ejemplos de initin Array<Int>()y IntArray(), su respuesta no es muy útil por ahora.
Lars Blumberg
La respuesta ha sido modificada
Ali hasan
Array <Int> le proporciona una matriz de enteros en caja, mientras que IntArray le proporciona una matriz int real.
Mike
4

Idioma Kotlin ha especializado clases para representar matrices de tipos primitivos y sin sobrecarga de boxeo: por ejemplo - IntArray, ShortArray, ByteArray, etc. Me necesidad de decir que estas clases no tienen relación de herencia a los padres Arrayde clase, 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.

Andy
fuente
3

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 tal como este: val array = Array(5, { i -> i }), los valores iniciales asignados son [0,1,2,3,4]y no dicen, [0,0,0,0,0]. Es por eso que a partir de la documentación, val asc = Array(5, { i -> (i * i).toString() })produce una respuesta de["0", "1", "4", "9", "16"]

Alf Moh
fuente
3

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

zyc zyc
fuente
2

Puedes probar esto:

var a = Array<Int>(5){0}
kulst
fuente
2

Simplemente puede usar los métodos de 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)
s1m0nw1
fuente
2

Me pregunto por qué nadie acaba de dar la respuesta más simple:

val array: Array<Int> = [1, 2, 3]

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:

    @Opción(
        nombre = "-h",
        alias = ["--help", "-?"],
        uso = "Mostrar esta ayuda"
    )
    ayuda var: booleano = falso

El argumento de opción "alias" es de tipo Array<String>

hdkrus
fuente
2
Tengo el siguiente error con este código: No compatible [Literales de colección fuera de las anotaciones]
Rémi P
No he visto esto antes. ¿Es esta sintaxis nueva para Kotlin?
Lars Blumberg
@LarsBlumberg, probablemente, comencé a usar Kotlin recientemente con IntelliJ 2019.1 e inicialicé una matriz de cadenas tal como lo mostré y funcionó
hdkrus
@ RémiP, Buen punto, lo usé en argumentos de anotaciones. Pero eso significaría que los literales de matriz funcionan en algunos contextos y en otros no.
hdkrus
1
@hdkrus ¿Por qué no actualiza su respuesta para mostrar cómo funciona la inicialización de matriz con anotaciones? Esto puede ser valioso para muchos lectores de estas preguntas.
Lars Blumberg
1

En mi caso, necesito inicializar mis elementos del cajón. Completo los datos con el siguiente código.

    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)

Clase de modelo personalizado

class DrawerItem(var icon: Int, var name: String) {

}
Rahul
fuente
Esto realmente no responde la pregunta de una manera sensata.
Qwerp-Derp
Compruebe el comentario en el que utilicé la función lambda para agregar elementos.
Rahul
Esto todavía parece una forma complicada de resolver este problema, al menos en comparación con las otras respuestas. También miré mi mensaje anterior y parece duro en retrospectiva. Lo siento.
Qwerp-Derp
Eso está bien, no hay problema. Solo traté de responder de una manera que resolvió mi problema, no lo comparé con otras respuestas. ¡Gracias!
Rahul
1

Declarar int array en global

var numbers= intArrayOf()

El siguiente método onCreate inicializa tu matriz con valor

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)
}
Nihal Desai
fuente
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo responde la pregunta mejora su valor a largo plazo.
rollstuhlfahrer
1

En Java, se puede inicializar una matriz como:

int numbers[] = new int[] {10, 20, 30, 40, 50}

Pero en Kotlin, una matriz se inicializó de muchas maneras, tales como:

Cualquier tipo genérico de matriz puede usar la función arrayOf () :

val arr = arrayOf(10, 20, 30, 40, 50)

val genericArray = arrayOf(10, "Stack", 30.00, 40, "Fifty")

Usando funciones de utilidad de Kotlin, se puede inicializar una matriz

val intArray = intArrayOf(10, 20, 30, 40, 50)
Samad Talukder
fuente
1

Manera simple:

Para entero:

número var = arrayOf <Int> (10, 20, 30, 40, 50)

Retener todos los tipos de datos

número var = arrayOf (10, "valor de cadena", 10.5)

Zafar Iqbal
fuente
0

Intialize array de esta manera: val paramValueList : Array<String?> = arrayOfNulls<String>(5)

Abhilash Das
fuente
0

De esta manera, puede inicializar la matriz int en koltin.

 val values: IntArray = intArrayOf(1, 2, 3, 4, 5,6,7)
Nikhil Katekhaye
fuente
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
leopal
0

Mi respuesta complementa @maroun, estas son algunas formas de inicializar una matriz:

Use una matriz

val numbers = arrayOf(1,2,3,4,5)

Use una matriz estricta

val numbers = intArrayOf(1,2,3,4,5)

Mezclar tipos de matrices

val numbers = arrayOf(1,2,3.0,4f)

Matrices de anidamiento

val numbersInitials = intArrayOf(1,2,3,4,5)
val numbers = arrayOf(numbersInitials, arrayOf(6,7,8,9,10))

Capacidad para comenzar con código dinámico

val numbers = Array(5){ it*2}
Fahed Hermoza
fuente