Come inizializzare un array in Kotlin con valori?


261

In Java un array può essere inizializzato come:

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

Come si presenta l'inizializzazione dell'array di Kotlin?


Forse dai un'occhiata ai documenti: kotlinlang.org/docs/reference/basic-types.html
— khlr

6
La documentazione nasconde in qualche modo la risposta. Invece di dare un esempio di codice sorgente citano la funzione (obsoleta) array()in un commento laterale: per creare un array, possiamo usare un array di funzioni di libreria () e passargli i valori degli elementi, in modo tale array (1, 2, 3 ) crea un array [1, 2, 3].
— Lars Blumberg,

8
Anche se mi piace Kotlin ma ho detto che la "documentazione di Kotlin" non è abbastanza buona (ho imparato di più da altri siti oltre a kotlinlang.org).
— Hassan Tareq,

1
Inoltre a volte vuoi solo un intRange che potresti fare: val numbers = 1..5che dia un intervallo di int da 1 a 5.
— Sylhare

Risposte:


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

Vedi Kotlin - Tipi di base per i dettagli.

Puoi anche fornire una funzione di inizializzazione come secondo parametro:

val numbers = IntArray(5) { 10 * (it + 1) }
// [10, 20, 30, 40, 50]

9
È preferibile utilizzare intArrayOfoltre arrayOf? Quindi IntArrayha vantaggi rispetto Array<Int>?
— Lars Blumberg,

17
@LarsBlumberg IntArray è uguale a int [], Array <Int> è uguale a Integer []
— user2235698

3
L'inizializzazione di un elenco è molto simile:listOf(10, 20, 30, 40, 50)
— Cristan,

Quando sto usando la funzione intArrayOf (), devo affrontare Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage. Sto usando jdk1.8.0_241e Intellij IDEA
— TeachMeJava

92

Vale la pena ricordare che quando si utilizza builtines Kotlin (ad esempio intArrayOf(), longArrayOf(), arrayOf(), ecc) non sono in grado di inizializzare l'array con i valori di default (o tutti i valori di valore desiderato) per una data dimensione, invece è necessario fare di inizializzazione tramite chiamando in base al costruttore della classe .

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

9
Quel secondo valore predefinito init usando lambda è stato di grande aiuto! Grazie
— rf43,

9
La seconda forma di inizializzazione può essere scritta come: IntArray(N) {i -> 2}e anche (quando si inizializza con una costante)IntArray(N) {2}
— David Soroko,

1
Invece di i possiamo usare "_" var arr = IntArray (N) {_ -> false}
— Navas pk,

1
Quello con lambda era esattamente ciò di cui avevo bisogno per avviare un array con dimensioni dinamiche e valore predefinito non opzionale. Grazie!
— mithunc il

48

Ecco un esempio:

fun main(args: Array<String>) {
    val arr = arrayOf(1, 2, 3);
    for (item in arr) {
        println(item);
    }
}

È inoltre possibile utilizzare un parco giochi per testare le funzionalità della lingua.


3
Un commento, per stampare il valore di un array, possiamo usare array.joinToString ("") al posto del loop.
— anticafe,

2
Funziona ma sembra più Java scritto in Kotlin che idiomatico Kotlin :)
— m0skit0

47

In Kotlin ci sono diversi modi.

var arr = IntArray(size) // construct with only size

Quindi semplicemente il valore iniziale degli utenti o di un'altra raccolta o dove vuoi.

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

Possiamo anche creare array con funzioni integrate come-

var arr = intArrayOf(1, 2, 3, 4, 5) // create an array with 5 values

Un altro modo

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.

È inoltre possibile utilizzare doubleArrayOf()o DoubleArray()qualsiasi tipo di primitiva anziché Int.


var arr = IntArray(size, { it * 1 } )è lo stesso divar arr = IntArray(size){it}
— Det

30

In Kotlin possiamo creare matrice usando arrayOf(), intArrayOf(), charArrayOf(), booleanArrayOf(), longArrayOf()funzioni.

Per esempio:

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)  

Per favore riformatta questa risposta in modo che sia chiaro cos'è il codice e cosa è un commento.

6

Vecchia domanda, ma se desideri utilizzare un intervallo:

var numbers: IntArray = IntRange(10, 50).step(10).toList().toIntArray()

Produce quasi lo stesso risultato di:

var numbers = Array(5, { i -> i*10 + 10 })

risultato: 10, 20, 30, 40, 50

Penso che la prima opzione sia un po 'più leggibile. Entrambi funzionano.


5

puoi usare questo metodo

var numbers=Array<Int>(size,init)
var numbers=IntArray(size,init)
var numbers= intArrayOf(1,2,3)

esempio

var numbers = Array<Int>(5, { i -> 0 })

init rappresenta il valore predefinito (inizializza)


1
Aiuta se fornisci esempi per initin Array<Int>()e IntArray(), la tua risposta non è molto utile al momento.
— Lars Blumberg,

La risposta è stata modificata
— Ali hasan il

Array <Int> ti offre un array di numeri interi inscatolati, mentre IntArray ti fornisce un vero array int.
— Mike,

4

Lingua Kotlin è specializzata classi per la rappresentazione di array di tipi primitivi, senza boxe in testa: per esempio - IntArray, ShortArray, ByteArray, ecc ho bisogno di dire che queste classi non hanno alcuna relazione eredità al genitore Arraydi classe, ma hanno lo stesso insieme di metodi e proprietà. Ognuno di essi ha anche una corrispondente funzione di fabbrica. Quindi, per inizializzare un array con valori in Kotlin devi solo digitare questo:

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

... o in questo modo:

val myArr = Array<Int>(5, { i -> ((i+1) * 10) })

myArr.forEach { println(it) }                                // 10, 20, 30, 40, 50

Ora puoi usarlo:

myArr[0] = (myArr[1] + myArr[2]) - myArr[3]

Spero che questo ti aiuti.


3

Penso che una cosa che vale la pena menzionare e che non sia abbastanza intuitiva dalla documentazione sia che, quando si utilizza una funzione di fabbrica per creare un array e si specifica la sua dimensione, l'array viene inizializzato con valori uguali ai loro valori di indice. Ad esempio, in un array come questo: val array = Array(5, { i -> i })i valori iniziali sono assegnati [0,1,2,3,4]e non dire, [0,0,0,0,0]. Questo è il motivo per cui dalla documentazione, val asc = Array(5, { i -> (i * i).toString() })produce una risposta di["0", "1", "4", "9", "16"]


3

È possibile creare un array Int come questo:

val numbers = IntArray(5, { 10 * (it + 1) })

5 è la dimensione della matrice Int. la funzione lambda è l'elemento init. intervallo 'it' in [0,4], più 1 intervallo di make in [1,5]

la funzione di origine è:

 /**
 * 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)
  ...
 }

Classe IntArray definita in Arrays.kt


2

Puoi provare questo:

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

2

Puoi semplicemente usare i metodi di libreria standard esistenti come mostrato qui:

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

Potrebbe avere senso usare un costruttore speciale però:

val numbers2 = IntArray(5) { (it + 1) * 10 }

Si passa una dimensione e una lambda che descrivono come avviare i valori. Ecco la documentazione:

/**
 * 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

Mi chiedo perché nessuno abbia dato le risposte più semplici:

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

Secondo uno dei commenti alla mia risposta originale, mi sono reso conto che funziona solo quando usato negli argomenti delle annotazioni (il che è stato davvero inaspettato per me).

Sembra che Kotlin non consenta di creare letterali array all'esterno delle annotazioni.

Ad esempio, guarda questo codice usando @Option dalla libreria args4j:

    @Opzione(
        name = "-h",
        alias = ["--help", "-?"],
        use = "Mostra questo aiuto"
    )
    var help: Boolean = false

L'argomento opzione "alias" è di tipo Array<String>


2
Ho questo errore con questo codice: Non supportato [Raccolta letterali al di fuori delle annotazioni]
— Rémi P

Non l'ho mai visto prima. Questa sintassi è nuova per Kotlin?
— Lars Blumberg,

@LarsBlumberg, probabilmente, ho appena iniziato a usare Kotlin di recente con IntelliJ 2019.1 e ho inizializzato un array di stringhe proprio come ho mostrato e ha funzionato
— hdkrus

@ RémiP, buon punto, l'ho usato su argomenti di annotazioni. Ciò significherebbe che i letterali array funzionano in alcuni contesti e in altri no?
— hdkrus,

1
@hdkrus Perché non aggiorni la tua risposta per mostrare come funziona l'inizializzazione dell'array con le annotazioni? Questo può essere utile per molti lettori di queste domande.
— Lars Blumberg,

1

Nel mio caso, devo inizializzare gli elementi del mio cassetto. Compilare i dati con il codice seguente.

    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)

Classe del modello personalizzato

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

}

Questo non risponde davvero alla domanda in modo sensato.
— Qwerp-Derp,

Si prega di controllare il commento in cui ho usato la funzione lambda per aggiungere elementi.
— Rahul,

Questo sembra ancora un modo contorto per risolvere questo problema, almeno rispetto alle altre risposte. Ho anche guardato il mio messaggio precedente, e a prima vista sembra duro - mi dispiace.
— Qwerp-Derp,

Va bene, nessun problema. Ho appena provato a rispondere in un modo che ha risolto il mio problema, non ho confrontato con altre risposte. Grazie!
— Rahul,

1

Dichiarare int array a livello globale

var numbers= intArrayOf()

Il prossimo metodo onCreate inizializza l'array con valore

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

Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo al perché e / o al modo in cui questo codice risponde alla domanda migliora il suo valore a lungo termine.
— rollstuhlfahrer

1

In Java un array può essere inizializzato come:

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

Ma in Kotlin un array ha inizializzato molti modi come:

Qualsiasi tipo generico di array è possibile utilizzare la funzione arrayOf () :

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

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

Utilizzando le funzioni di utilità di Kotlin è possibile inizializzare un array

val intArray = intArrayOf(10, 20, 30, 40, 50)

1

Modo semplice:

Per intero:

var number = arrayOf <Int> (10, 20, 30, 40, 50)

Mantieni tutti i tipi di dati

var number = arrayOf (10, "valore stringa", 10.5)


0

inizializzare l'array in questo modo: val paramValueList : Array<String?> = arrayOfNulls<String>(5)


0

In questo modo, puoi inizializzare l'array int in koltin.

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

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
— leopale il

0

La mia risposta completa @maroun questi sono alcuni modi per inizializzare un array:

Usa un array

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

Utilizzare un array rigoroso

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

Mescola i tipi di matrici

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

Matrici di nidificazione

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

Possibilità di iniziare con codice dinamico

val numbers = Array(5){ it*2}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.