¿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?


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]

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 }

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.


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.


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)  

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.


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)


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.


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"]


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


2

Puedes probar esto:

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

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)

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>


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) {

}

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)
}

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)

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)


0

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


0

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

 val values: IntArray = intArrayOf(1, 2, 3, 4, 5,6,7)

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}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.