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.