2015-07-12 9 views
88

W Javie tablica może być inicjowany, takich jak:Jak zainicjować tablicę w Kotlin za pomocą wartości?

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

Jak tablicę inicjalizacja wyglądać Kotlin Like?

+0

Może to mieć Spojrzenie na dokumenty: http://kotlinlang.org/docs/reference/basic-types.html – khlr

+2

Dokumentacja nieco ukrywa odpowiedź. Zamiast podawać przykład kodu źródłowego, wspominają o (przestarzałej) funkcji 'array()' w komentarzu bocznym: _ Aby utworzyć tablicę, możemy użyć tablicy funkcji biblioteki() i przekazać jej wartości pozycji, tak aby tablica (1, 2, 3) tworzy tablicę [1, 2, 3] ._ –

+1

Chociaż lubię Kotlin, ale mówię "Dokumentacja Kotlina" nie jest wystarczająco dobra (dowiedziałem się więcej z innych stron niż na stronie kotlinlang.org). –

Odpowiedz

100

Można:

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

Zobacz Kotlin - Basic Types szczegóły.

+1

Dzięki. Ostatnio Kotlin sugeruje użycie 'intArrayOf'. –

+3

Czy lepiej jest używać 'intArrayOf' zamiast' tablicaOf'? W ten sposób "IntArray" ma przewagę nad 'Array '? –

+0

Właściwie to nie jestem świadomy najnowszego "intArrayOf" Kotlin, byłbym zadowolony z odniesienia się do tego! – Maroun

27

Oto przykład:

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

Można również użyć playground przetestować możliwości językowe.

21

Warto wspomnieć, że podczas korzystania Kotlin builtines (np intArrayOf(), longArrayOf(), arrayOf() itp) nie są w stanie zainicjować tablicę z wartościami domyślnymi (lub wszystkie wartości do żądanej wartości) dla danego rozmiaru, a nie trzeba zainicjować poprzez wywołanie zgodnie z konstruktorem klasy.

// 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}) 
+0

Ta druga domyślna wartość init przy użyciu lambda była super pomocna! Dzięki – rf43

3

można użyć tej metody

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

przykład

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

startowych reprezentuje wartość domyślną (zainicjować)

+1

Pomaga, jeśli podajesz przykłady dla 'init' w' Array () 'i' IntArray() ', twoja odpowiedź nie jest zbyt pomocna jak na razie. –

+0

Odpowiedź została zmieniona –

2

Stare pytanie, ale jeśli chcesz używać zakres:

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

Daje prawie taki sam wynik jak:

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

wyniki: 10, 20, 30, 40, 50

Myślę, że pierwsza opcja jest nieco bardziej czytelny. Obie działają.

+0

"pierwsza opcja jest trochę bardziej czytelna" - dyskusyjna :) – Antek

15

W Kotlinie Istnieje kilka sposobów.

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

Następnie po prostu wartość początkowa od użytkowników lub z innej kolekcji lub gdziekolwiek chcesz.

var arr = IntArray(size, { 0 }) // construct with size and fill array with 0 
var arr = IntArray(size, { it * 1 }) // construct with size and fill with its index 

Możemy również stworzyć tablicę z wbudowaną funkcją jak-

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

Innym sposobem

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. 

Można również użyć doubleArrayOf() lub DoubleArray() lub dowolny rodzaj prymitywnego zamiast Int.

3

Myślę, że jedną rzecz, o której warto wspomnieć i która nie jest wystarczająco intuicyjna w dokumentacji, jest to, że gdy używasz funkcji fabryki do utworzenia tablicy, a Ty określasz jej rozmiar, tablica jest inicjowana wartościami równymi ich wartości indeksu.Na przykład w tablicy takiej jak ta: val array = Array(5, { i -> i }), przypisane początkowe wartości to [0,1,2,3,4] i nie powiedz, [0,0,0,0,0]. Dlatego z dokumentacji val asc = Array(5, { i -> (i * i).toString() }) uzyskano odpowiedź: ["0", "1", "4", "9", "16"]

1

W moim przypadku muszę zainicjalizować moje elementy szuflady. Wypełniam dane poniższym kodem.

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) 

model niestandardowy wykładowa

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

} 
+0

To nie odpowiada na pytanie w sensowny sposób. –

+0

Proszę sprawdzić komentarz, w którym użyłem funkcji lambda do dodawania przedmiotów. – Rahul

+0

To nadal wydaje się skomplikowanym sposobem rozwiązania tego problemu, przynajmniej w porównaniu z innymi odpowiedziami. Spojrzałem też na moją poprzednią wiadomość i wydaje mi się, że jest to trudne z perspektywy czasu - przepraszam. –

1

Można spróbować to:

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

intialize tablicę w ten sposób: val paramValueList : Array<String?> = arrayOfNulls<String>(5)

0

Można utworzyć tablicę Int takiego:

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

5 to rozmiar międzywymiarowy. funkcja lambda jest funkcją inicjującą element. 'To zakres z [0,4], oraz 1 Zakres wprowadzone w [1,5]

funkcji pochodzenia jest:

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

klasy IntArray zdefiniowane w Arrays.kt

Powiązane problemy