Wie initialisiere ich ein Array in Kotlin mit Werten?

261

In Java kann ein Array wie folgt initialisiert werden:

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

Wie sieht die Array-Initialisierung von Kotlin aus?

Lars Blumberg
quelle
Vielleicht schauen Sie sich einfach die Dokumente an: kotlinlang.org/docs/reference/basic-types.html
khlr
6
Die Dokumentation verbirgt die Antwort etwas. Anstatt ein Quellcodebeispiel anzugeben, erwähnen sie die (veraltete) array()Funktion in einem Nebenkommentar: Um ein Array zu erstellen, können wir ein Bibliotheksfunktionsarray () verwenden und die Elementwerte an dieses übergeben, sodass das Array (1, 2, 3) ) erstellt ein Array [1, 2, 3].
Lars Blumberg
8
Ich mag zwar Kotlin, aber ich habe gesagt, "Kotlin-Dokumentation" ist nicht gut genug (ich habe mehr von anderen Websites als kotlinlang.org gelernt).
Hassan Tareq
1
Manchmal möchten Sie auch nur einen intRange, den Sie ausführen können: Dies val numbers = 1..5ergibt einen int-Bereich von 1 bis 5.
Sylhare

Antworten:

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

Weitere Informationen finden Sie unter Kotlin - Grundtypen .

Sie können auch eine Initialisierungsfunktion als zweiten Parameter bereitstellen:

val numbers = IntArray(5) { 10 * (it + 1) }
// [10, 20, 30, 40, 50]
Maroun
quelle
8
Ist es vorzuziehen, intArrayOfüber zu verwenden arrayOf? Hat also IntArrayVorteile gegenüber Array<Int>?
Lars Blumberg
16
@LarsBlumberg IntArray ist gleich int [], Array <Int> ist das gleiche wie Integer []
user2235698
3
Das Initialisieren einer Liste ist sehr ähnlich:listOf(10, 20, 30, 40, 50)
Cristan
Wenn ich die Funktion intArrayOf () verwende, stehe ich vor Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage. Ich benutze jdk1.8.0_241und Intellij IDEA
TeachMeJava
92

Erwähnenswert , dass , wenn Kotlin builtines (zB intArrayOf(), longArrayOf(), arrayOf(), etc.) , die Sie nicht in der Lage sind das Array mit den Standardwerten (oder alle Werte auf den gewünschten Wert) für eine bestimmte Größe zu initialisieren, anstatt Sie initialize über Aufruf nach Klassenkonstruktors tun müssen .

// 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
quelle
9
Dieser zweite Standardwert init mit dem Lambda war super hilfreich! Danke
rf43
9
Die zweite Form der Initialisierung kann geschrieben werden als: IntArray(N) {i -> 2}und sogar (bei Initialisierung mit einer Konstanten)IntArray(N) {2}
David Soroko
1
Anstelle von i können wir "_" var arr = IntArray (N) {_ -> false}
Navas pk
1
Das mit dem Lambda war genau das, was ich brauchte, um ein Array mit dynamischer Größe und nicht optionalem Standardwert zu initiieren. Vielen Dank!
Mithunc
48

Hier ist ein Beispiel:

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

Sie können auch einen Spielplatz verwenden , um Sprachfunktionen zu testen.

Schattenglanz
quelle
2
Ein Kommentar, um den Wert eines Arrays zu drucken, können wir stattdessen array.joinToString ("") als Schleife verwenden.
Anticafe
2
Funktioniert aber sieht mehr Java in Kotlin geschrieben als idiomatisches Kotlin :)
m0skit0
47

In Kotlin gibt es mehrere Möglichkeiten.

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

Dann einfach Anfangswert von Benutzern oder aus einer anderen Sammlung oder wo immer Sie wollen.

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

Wir können auch Arrays mit eingebauten Funktionen wie erstellen

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

Ein anderer Weg

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.

Sie können auch doubleArrayOf()oder DoubleArray()oder einen beliebigen primitiven Typ anstelle von Int verwenden.

HM Nayem
quelle
var arr = IntArray(size, { it * 1 } )ist das gleiche wievar arr = IntArray(size){it}
Det
30

In Kotlin können wir Array erstellen arrayOf(), intArrayOf(), charArrayOf(), booleanArrayOf(), longArrayOf()Funktionen.

Beispielsweise:

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
quelle
Bitte formatieren Sie diese Antwort neu, damit klar ist, was Code und was Kommentar ist.
6

Alte Frage, aber wenn Sie einen Bereich verwenden möchten:

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

Ergibt fast das gleiche Ergebnis wie:

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

Ergebnis: 10, 20, 30, 40, 50

Ich denke, die erste Option ist etwas besser lesbar. Beide arbeiten.

Brooks DuBois
quelle
5

Sie können diese Methoden verwenden

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

Beispiel

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

init repräsentiert den Standardwert (initialize)

Ali Hasan
quelle
1
Es ist hilfreich, wenn Sie Beispiele für initin Array<Int>()und IntArray()angeben. Ihre Antwort ist derzeit nicht sehr hilfreich.
Lars Blumberg
Die Antwort wurde geändert
Ali hasan
Array <Int> gibt Ihnen ein Array von Ganzzahlen in Kästchen, während IntArray Ihnen ein tatsächliches int-Array liefert.
Mike
4

Kotlin Sprache hat für die Darstellung von Arrays von primitiven Typen Klassen spezialisiert ohne Overhead - Boxen: zum Beispiel - IntArray, ShortArray, ByteArrayetc. Ich muß sagen , dass diese Klassen keinen Erbe Bezug auf die Eltern haben ArrayKlasse, aber sie haben den gleichen Satz von Methoden und Eigenschaften. Jeder von ihnen hat auch eine entsprechende Werksfunktion. Um ein Array mit Werten in Kotlin zu initialisieren, müssen Sie nur Folgendes eingeben:

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

... oder so:

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

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

Jetzt können Sie es verwenden:

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

Hoffe das hilft.

Andy
quelle
3

Ich denke, eine Sache, die erwähnenswert und aus der Dokumentation nicht intuitiv genug ist, ist, dass, wenn Sie eine Factory-Funktion zum Erstellen eines Arrays verwenden und dessen Größe angeben, das Array mit Werten initialisiert wird, die ihren Indexwerten entsprechen. In einem Array wie diesem: val array = Array(5, { i -> i })sind die zugewiesenen Anfangswerte [0,1,2,3,4]und sagen nicht , [0,0,0,0,0]. Deshalb ergibt sich aus der Dokumentation val asc = Array(5, { i -> (i * i).toString() })eine Antwort von["0", "1", "4", "9", "16"]

Alf Moh
quelle
3

Sie können ein Int-Array wie folgt erstellen:

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

5 ist die Int-Array-Größe. Die Lambda-Funktion ist die Element-Init-Funktion. 'it'-Bereich in [0,4] plus 1 Make-Bereich in [1,5]

Ursprungsfunktion ist:

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

IntArray-Klasse, definiert in Arrays.kt

zyc zyc
quelle
2

Sie können dies versuchen:

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

Sie können einfach die vorhandenen Standard - Bibliothek verwenden Methoden wie hier gezeigt:

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

Es kann jedoch sinnvoll sein, einen speziellen Konstruktor zu verwenden:

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

Sie übergeben eine Größe und ein Lambda, die beschreiben, wie die Werte initiiert werden. Hier ist die Dokumentation:

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

Ich frage mich, warum niemand die einfachsten Antworten gegeben hat:

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

Gemäß einem der Kommentare zu meiner ursprünglichen Antwort wurde mir klar, dass dies nur funktioniert, wenn es in Annotationsargumenten verwendet wird (was für mich wirklich unerwartet war).

Kotlin erlaubt anscheinend nicht, Array-Literale außerhalb von Annotationen zu erstellen.

Sehen Sie sich diesen Code beispielsweise mit @Option aus der args4j-Bibliothek an:

    @Möglichkeit(
        name = "-h",
        Aliase = ["--help", "-?"],
        usage = "Zeige diese Hilfe"
    )
    var help: Boolean = false

Das Optionsargument "Aliase" ist vom Typ Array<String>

hdkrus
quelle
2
Ich habe den folgenden Fehler mit diesem Code: Nicht unterstützt [Sammlungsliterale außerhalb von Anmerkungen]
Rémi P
Ich habe das noch nie gesehen. Ist diese Syntax für Kotlin neu?
Lars Blumberg
@LarsBlumberg, wahrscheinlich habe ich vor kurzem angefangen, Kotlin mit IntelliJ 2019.1 zu verwenden, und ich habe ein String-Array initialisiert, genau wie ich es gezeigt habe, und es hat funktioniert
hdkrus
@ RémiP, Guter Punkt, ich habe es für Annotationsargumente verwendet. Aber das würde bedeuten, dass Array-Literale in einigen Kontexten funktionieren und in anderen nicht?
HDKRUS
1
@hdkrus Warum aktualisieren Sie Ihre Antwort nicht, um zu zeigen, wie die Array-Initialisierung mit Anmerkungen funktioniert? Dies kann für viele Leser dieser Fragen von Wert sein.
Lars Blumberg
1

In meinem Fall muss ich meine Schubladenelemente initialisieren. Ich fülle die Daten mit dem folgenden Code.

    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)

Benutzerdefinierte Modellklasse-

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

}
Rahul
quelle
Dies beantwortet die Frage nicht wirklich auf vernünftige Weise.
Qwerp-Derp
Bitte überprüfen Sie den Kommentar, in dem ich die Lambda-Funktion zum Hinzufügen von Elementen verwendet habe.
Rahul
Dies scheint immer noch ein komplizierter Weg zu sein, um dieses Problem zu lösen, zumindest im Vergleich zu den anderen Antworten. Ich habe mir auch meine vorherige Nachricht angesehen und sie scheint im Nachhinein hart zu sein - es tut mir leid.
Qwerp-Derp
Das ist in Ordnung, kein Problem. Ich habe nur versucht, auf eine Weise zu antworten, die mein Problem gelöst hat. Ich habe es nicht mit anderen Antworten verglichen. Danke dir!
Rahul
1

Deklarieren Sie das int-Array auf global

var numbers= intArrayOf()

Die nächste onCreate-Methode initialisiert Ihr Array mit value

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
quelle
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Rollstuhlfahrer
1

In Java kann ein Array wie folgt initialisiert werden:

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

Aber in Kotlin wurde ein Array auf viele Arten initialisiert, wie zum Beispiel:

Jeder generische Array-Typ, den Sie mit der Funktion arrayOf () verwenden können:

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

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

Mit den Utility-Funktionen von Kotlin kann ein Array initialisiert werden

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

Einfacher Weg:

Für Integer:

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

Halten Sie alle Datentypen

var number = arrayOf (10, "string value", 10.5)

Zafar Iqbal
quelle
0

Array auf folgende Weise initialisieren: val paramValueList : Array<String?> = arrayOfNulls<String>(5)

Abhilash Das
quelle
0

Auf diese Weise können Sie das int-Array in koltin initialisieren.

 val values: IntArray = intArrayOf(1, 2, 3, 4, 5,6,7)
Nikhil Katekhaye
quelle
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Leopal
0

Meine Antwort ergänzt @maroun. Dies sind einige Möglichkeiten, ein Array zu initialisieren:

Verwenden Sie ein Array

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

Verwenden Sie ein striktes Array

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

Mischen Sie Arten von Matrizen

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

Verschachtelungsarrays

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

Möglichkeit, mit dynamischem Code zu beginnen

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