Jak zainicjować tablicę w Kotlin z wartościami?


261

W Javie można zainicjować tablicę, taką jak:

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

Jak wygląda inicjalizacja tablicy Kotlina?


Może po prostu zajrzyj do dokumentacji: kotlinlang.org/docs/reference/basic-types.html
khlr

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

8
Chociaż lubię Kotlin, ale mówię, że „Dokumentacja Kotlin” nie jest wystarczająco dobra (nauczyłem się więcej z innych stron niż kotlinlang.org).
Hassan Tareq

1
Również czasami potrzebujesz intRange, który możesz zrobić: val numbers = 1..5co daje zakres int od 1 do 5.
Sylhare

Odpowiedzi:


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

Szczegółowe informacje można znaleźć w Kotlin - podstawowe typy .

Możesz także podać funkcję inicjalizacyjną jako drugi parametr:

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

8
Czy lepiej jest używać intArrayOfponad arrayOf? Czy to IntArrayma przewagę nad Array<Int>?
Lars Blumberg,

16
@LarsBlumberg IntArray jest równe int [], tablica <Int> jest taka sama jak Integer []
user2235698

3
Inicjowanie listy jest bardzo podobne:listOf(10, 20, 30, 40, 50)
Cristan,

Kiedy używam funkcji intArrayOf (), patrzę w twarz Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage. Używam jdk1.8.0_241i Intellij IDEA
TeachMeJava

92

Warto wspomnieć, że podczas korzystania builtines Kotlin (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, zamiast trzeba zrobić initialize poprzez wywołanie według konstruktora 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 }

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

9
Druga forma inicjalizacji może być zapisana jako: IntArray(N) {i -> 2}a nawet (podczas inicjalizacji ze stałą)IntArray(N) {2}
David Soroko

1
Zamiast i możemy użyć „_” var arr = IntArray (N) {_ -> false}
Navas pk

1
Ten z lambda był dokładnie tym, czego potrzebowałem, aby zainicjować tablicę z dynamicznym rozmiarem i nie opcjonalną wartością domyślną. Dzięki!
mithunc,

48

Oto przykład:

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

Możesz także skorzystać z placu zabaw, aby przetestować funkcje językowe.


2
Jeden komentarz, aby wydrukować wartość tablicy, możemy użyć array.joinToString („”) zamiast pętli.
anticafe

2
Działa, ale wygląda bardziej na Javę napisaną w Kotlinie niż idiomatyczny Kotlin :)
m0skit0

47

W Kotlin jest 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} // 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

Inny sposób

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żesz także użyć doubleArrayOf()lub DoubleArray()dowolnego typu pierwotnego zamiast Int.


var arr = IntArray(size, { it * 1 } )jest taki sam jakvar arr = IntArray(size){it}
Det

30

W Kotlin możemy stworzyć tablicę używając arrayOf(), intArrayOf(), charArrayOf(), booleanArrayOf(), longArrayOf()funkcje.

Na przykład:

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)  

Sformatuj ponownie tę odpowiedź, aby było jasne, co to jest kod, a co komentarz.

6

Stare pytanie, ale jeśli chcesz użyć zakresu:

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

Daje prawie taki sam wynik jak:

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

wynik: 10, 20, 30, 40, 50

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


5

możesz użyć tych metod

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

init reprezentuje wartość domyślną (inicjowanie)


1
To pomaga, jeśli podać przykłady na initw Array<Int>()i IntArray(), odpowiedź nie jest dużo pomocne, jak teraz.
Lars Blumberg

Odpowiedź została zmodyfikowana
Ali hasan

Tablica <Int> daje tablicę liczb całkowitych w ramkach, natomiast IntArray daje rzeczywistą tablicę int.
Mike,

4

Język Kotlin specjalizuje zajęcia do reprezentowania tablice prymitywnych typów bez boks napowietrznych: na przykład - IntArray, ShortArray, ByteArray, itd. Muszę powiedzieć, że klasy te nie mają żadnego związku spadków dominującej Arrayklasy, ale mają ten sam zestaw metod i właściwości. Każdy z nich ma również odpowiednią funkcję fabryczną. Aby zainicjować tablicę z wartościami w Kotlinie, wystarczy wpisać:

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

... lub w ten sposób:

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

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

Teraz możesz go użyć:

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

Mam nadzieję że to pomoże.


3

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


3

Możesz utworzyć tablicę Int w następujący sposób:

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

5 jest rozmiarem Int Array. funkcja lambda jest funkcją początkową elementu. zakres „it” w [0,4] plus 1 zasięg marki w [1,5]

funkcja pochodzenia to:

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

Klasa IntArray zdefiniowana w Arrays.kt



2

Możesz po prostu użyć istniejących standardowych metod bibliotecznych , jak pokazano tutaj:

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

Warto jednak użyć specjalnego konstruktora:

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

Podajesz rozmiar i lambda, które opisują, jak zainicjować wartości. Oto dokumentacja:

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

Zastanawiam się, dlaczego nikt nie udzielił najprostszych odpowiedzi:

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

Zgodnie z jednym z komentarzy do mojej pierwotnej odpowiedzi, zdałem sobie sprawę, że działa to tylko wtedy, gdy jest użyte w argumentach adnotacji (co było dla mnie naprawdę nieoczekiwane).

Wygląda na to, że Kotlin nie pozwala na tworzenie literałów tablicowych poza adnotacjami.

Na przykład spójrz na ten kod, używając @Option z biblioteki args4j:

    @Opcja(
        name = "-h",
        aliasy = [„--help”, „-?”],
        wykorzystanie = „Pokaż tę pomoc”
    )
    var help: Boolean = false

Argument opcji „aliasy” jest typu Array<String>


2
Mam następujący błąd z tym kodem: Nieobsługiwane [Zbiór literałów poza adnotacjami]
Rémi P

Nie widziałem tego wcześniej. Czy ta składnia jest nowa w Kotlin?
Lars Blumberg

@LarsBlumberg, prawdopodobnie zacząłem ostatnio używać Kotlina z IntelliJ 2019.1 i zainicjowałem tablicę ciągów, tak jak pokazałem i zadziałało
hdkrus

@ RémiP, Dobra uwaga, użyłem go w argumentach adnotacji. Ale to by oznaczało, że literały tablicowe działają w niektórych kontekstach, a w innych nie?
hdkrus

1
@hdkrus Dlaczego nie zaktualizujesz swojej odpowiedzi, aby pokazać, jak inicjowanie tablicy działa z adnotacjami? Może to mieć wartość dla wielu czytelników tych pytań.
Lars Blumberg,

1

W moim przypadku muszę zainicjować moje elementy szuflady. Dane wypełniam 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)

Klasa niestandardowego modelu

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

}

To tak naprawdę nie odpowiada na pytanie w rozsądny sposób.
Qwerp-Derp,

Proszę sprawdzić komentarz, w którym użyłem funkcji lambda, aby dodać elementy.
Rahul,

Nadal wydaje się to skomplikowanym sposobem rozwiązania tego problemu, przynajmniej w porównaniu z innymi odpowiedziami. Spojrzałem również na moją poprzednią wiadomość i wydaje się, że z perspektywy czasu jest ona trudna - przepraszam.
Qwerp-Derp,

W porządku, nie ma problemu. Próbowałem tylko odpowiedzieć w sposób, który rozwiązał mój problem, nie porównałem go z innymi odpowiedziami. Dziękuję Ci!
Rahul

1

Zadeklaruj tablicę int w globalnej

var numbers= intArrayOf()

następnie metoda onCreate zainicjuje tablicę wartością

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

Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość.
rollstuhlfahrer

1

W Javie można zainicjować tablicę, taką jak:

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

Ale w Kotlin tablica została zainicjowana na wiele sposobów, takich jak:

Dowolny ogólny typ tablicy, której można użyć funkcji arrayOf () :

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

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

Za pomocą funkcji narzędziowych Kotlin można zainicjować tablicę

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

1

Prosta droga:

Dla liczby całkowitej:

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

Przechowuj wszystkie typy danych

var number = arrayOf (10, „string string”, 10.5)


0

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


0

W ten sposób możesz zainicjować tablicę int w koltin.

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

Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
leopal

0

Moja odpowiedź stanowi uzupełnienie @maroun. Oto kilka sposobów na zainicjowanie tablicy:

Użyj tablicy

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

Użyj ścisłej tablicy

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

Mieszaj rodzaje matryc

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

Zagnieżdżanie tablic

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

Możliwość rozpoczęcia od kodu dynamicznego

val numbers = Array(5){ it*2}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.