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.
¿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 Nval arr =IntArray(N)// Array of integers of a size of N initialized with a default value of 2val arr =IntArray(N){ i ->2}
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
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"]
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.
*/publicclassIntArray(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)...}
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)
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>
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. DrawerItemval drawerItems =Array<DrawerItem>(iconsArr.size,init={ index ->DrawerItem(iconsArr[index], names[index])})Log.d(LOGGER_TAG,"Number of items in drawer is: "+ drawerItems.size)
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
overridefun 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
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))
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].val numbers = 1..5
que da un rango int de 1 a 5.Respuestas:
Ver Kotlin - Tipos básicos para más detalles.
También puede proporcionar una función de inicializador como segundo parámetro:
fuente
intArrayOf
másarrayOf
? Por lo tantoIntArray
tiene ventajas másArray<Int>
?listOf(10, 20, 30, 40, 50)
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage
. Estoy usandojdk1.8.0_241
e Intellij IDEACabe 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 .fuente
IntArray(N) {i -> 2}
e incluso (cuando se inicializa con una constante)IntArray(N) {2}
Aquí hay un ejemplo:
También puede usar un patio de juegos para evaluar las características del lenguaje.
fuente
En Kotlin hay varias formas.
Luego, simplemente el valor inicial de los usuarios o de otra colección o donde quieras.
También podemos crear una matriz con funciones integradas como:
De otra manera
También puede usar
doubleArrayOf()
oDoubleArray()
cualquier tipo primitivo en lugar de Int.fuente
var arr = IntArray(size, { it * 1 } )
es lo mismo quevar arr = IntArray(size){it}
En Kotlin podemos crear matriz utilizando
arrayOf()
,intArrayOf()
,charArrayOf()
,booleanArrayOf()
,longArrayOf()
funciones.Por ejemplo:
fuente
Antigua pregunta, pero si desea utilizar un rango:
Produce casi el mismo resultado que:
resultado: 10, 20, 30, 40, 50
Creo que la primera opción es un poco más legible. Ambos trabajan.
fuente
puedes usar estos métodos
ejemplo
init representa el valor predeterminado (inicializar)
fuente
init
inArray<Int>()
yIntArray()
, su respuesta no es muy útil por ahora.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 padresArray
de 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:... o de esta manera:
Ahora puedes usarlo:
Espero que esto ayude.
fuente
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"]
fuente
Puede crear una matriz Int como esta:
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:
Clase IntArray definida en Arrays.kt
fuente
Puedes probar esto:
fuente
Simplemente puede usar los métodos de biblioteca estándar existentes como se muestra aquí:
Sin embargo, podría tener sentido usar un constructor especial:
Pasa un tamaño y una lambda que describe cómo iniciar los valores. Aquí está la documentación:
fuente
Me pregunto por qué nadie acaba de dar la respuesta más simple: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:
El argumento de opción "alias" es de tipo
Array<String>
fuente
En mi caso, necesito inicializar mis elementos del cajón. Completo los datos con el siguiente código.
Clase de modelo personalizado
fuente
Declarar int array en global
El siguiente método onCreate inicializa tu matriz con valor
fuente
En Java, se puede inicializar una matriz como:
Pero en Kotlin, una matriz se inicializó de muchas maneras, tales como:
Cualquier tipo genérico de matriz puede usar la función arrayOf () :
Usando funciones de utilidad de Kotlin, se puede inicializar una matriz
fuente
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)
fuente
Intialize array de esta manera:
val paramValueList : Array<String?> = arrayOfNulls<String>(5)
fuente
De esta manera, puede inicializar la matriz int en koltin.
fuente
Mi respuesta complementa @maroun, estas son algunas formas de inicializar una matriz:
Use una matriz
Use una matriz estricta
Mezclar tipos de matrices
Matrices de anidamiento
Capacidad para comenzar con código dinámico
fuente