Bagaimana cara menginisialisasi array di Kotlin dengan nilai?


261

Di Jawa array dapat diinisialisasi seperti:

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

Bagaimana tampilan inisialisasi array Kotlin?


Mungkin hanya melihat pada dokumen: kotlinlang.org/docs/reference/basic-types.html
khlr

6
Dokumentasi agak menyembunyikan jawabannya. Alih-alih memberikan contoh kode sumber, mereka menyebutkan fungsi (usang) array()di komentar samping: Untuk membuat array, kita bisa menggunakan array fungsi perpustakaan () dan meneruskan nilai item ke sana, sehingga array (1, 2, 3 ) menciptakan sebuah array [1, 2, 3].
Lars Blumberg

8
Meskipun saya suka Kotlin tetapi saya telah mengatakan "dokumentasi Kotlin" tidak cukup baik (saya belajar lebih banyak dari situs lain daripada kotlinlang.org).
Hassan Tareq

1
Juga kadang-kadang Anda hanya ingin intRange yang bisa Anda lakukan: val numbers = 1..5yang memberikan rentang int dari 1 hingga 5.
Sylhare

Jawaban:


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

Lihat Kotlin - Tipe Dasar untuk detailnya.

Anda juga dapat menyediakan fungsi penginisialisasi sebagai parameter kedua:

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

9
Apakah lebih baik menggunakan intArrayOflebih arrayOf? Jadi memang IntArraypunya kelebihan dibanding Array<Int>?
Lars Blumberg

17
@LarsBlumberg IntArray sama dengan int [], Array <Int> sama dengan Integer []
user2235698

3
Menginisialisasi daftar sangat mirip:listOf(10, 20, 30, 40, 50)
Cristan

Ketika saya menggunakan fungsi intArrayOf (), saya hadapi Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage. Saya menggunakan jdk1.8.0_241dan Intellij IDEA
TeachMeJava

92

Perlu disebutkan bahwa ketika menggunakan builtines Kotlin (misalnya intArrayOf(), longArrayOf(), arrayOf(), dll) Anda tidak dapat menginisialisasi array dengan nilai default (atau semua nilai ke nilai yang diinginkan) untuk ukuran tertentu, bukan yang perlu Anda lakukan initialize via memanggil menurut kelas konstruktor .

// 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
Nilai default kedua init menggunakan lambda sangat membantu! Terima kasih
rf43

9
Bentuk inisialisasi kedua dapat ditulis sebagai: IntArray(N) {i -> 2}dan bahkan (ketika diinisialisasi dengan konstanta)IntArray(N) {2}
David Soroko

1
Alih-alih saya dapat menggunakan "_" var arr = IntArray (N) {_ -> false}
Navas pk

1
Yang satu dengan lambda adalah persis apa yang saya butuhkan untuk init array dengan ukuran dinamis dan nilai default non-opsional. Terima kasih!
mithunc

48

Ini sebuah contoh:

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

Anda juga dapat menggunakan taman bermain untuk menguji fitur bahasa.


3
Satu komentar, untuk mencetak nilai array, kita bisa menggunakan array.joinToString ("") sebagai ganti perulangan.
anticafe

2
Bekerja tetapi terlihat lebih Jawa ditulis dalam Kotlin daripada Kotlin idiomatik :)
m0skit0

47

Di Kotlin Ada Beberapa Cara.

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

Kemudian cukup nilai awal dari pengguna atau dari koleksi lain atau di mana pun Anda inginkan.

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

Kami juga dapat membuat array dengan fungsi bawaan seperti-

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

Cara lain

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.

Anda juga dapat menggunakan doubleArrayOf()atau DoubleArray()atau tipe primitif apa pun alih-alih Int.


var arr = IntArray(size, { it * 1 } )sama denganvar arr = IntArray(size){it}
Det

30

Dalam Kotlin kita dapat membuat array menggunakan arrayOf(), intArrayOf(), charArrayOf(), booleanArrayOf(), longArrayOf()fungsi.

Sebagai contoh:

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)  

Harap format ulang jawaban ini sehingga jelas apa itu kode dan apa komentar.

6

Pertanyaan lama, tetapi jika Anda ingin menggunakan rentang:

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

Menghasilkan hasil yang hampir sama dengan:

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

hasil: 10, 20, 30, 40, 50

Saya pikir opsi pertama sedikit lebih mudah dibaca. Keduanya bekerja.


5

Anda dapat menggunakan metode ini

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

contoh

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

init mewakili nilai default (inisialisasi)


1
Ini membantu jika Anda memberikan contoh untuk initdi Array<Int>()dan IntArray(), jawaban Anda tidak banyak membantu seperti yang sekarang.
Lars Blumberg

Jawabannya telah diubah
Ali hasan

Array <Int> memberi Anda array bilangan bulat kotak, sedangkan IntArray memberi Anda array int yang sebenarnya.
Mike

4

Bahasa Kotlin memiliki spesialisasi kelas untuk mewakili array dari tipe primitif tanpa tinju overhead: misalnya - IntArray, ShortArray, ByteArray, dll saya perlu mengatakan bahwa kelas-kelas ini tidak memiliki hubungan warisan untuk orang tua Arraykelas, tetapi mereka memiliki set yang sama metode dan properti. Masing-masing dari mereka juga memiliki fungsi pabrik yang sesuai. Jadi, untuk menginisialisasi array dengan nilai-nilai di Kotlin Anda hanya perlu mengetik ini:

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

... atau dengan cara ini:

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

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

Sekarang Anda dapat menggunakannya:

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

Semoga ini membantu.


3

Saya pikir satu hal yang layak disebutkan dan tidak cukup intuitif dari dokumentasi adalah bahwa, ketika Anda menggunakan fungsi pabrik untuk membuat array dan Anda menentukan ukurannya, array diinisialisasi dengan nilai yang sama dengan nilai indeksnya. Misalnya, dalam array seperti ini val array = Array(5, { i -> i }):, nilai awal yang ditetapkan adalah [0,1,2,3,4]dan tidak mengatakan [0,0,0,0,0],. Itu sebabnya dari dokumentasi, val asc = Array(5, { i -> (i * i).toString() })menghasilkan jawaban["0", "1", "4", "9", "16"]


3

Anda dapat membuat Int Array seperti ini:

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

5 adalah ukuran Int Array. fungsi lambda adalah fungsi elemen init. kisaran 'it' di [0,4], ditambah 1 buat kisaran di [1,5]

fungsi asal adalah:

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

Kelas IntArray didefinisikan dalam Arrays.kt


2

Anda dapat mencoba ini:

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

2

Anda cukup menggunakan metode pustaka standar yang ada seperti yang ditunjukkan di sini:

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

Mungkin masuk akal untuk menggunakan konstruktor khusus:

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

Anda memberikan ukuran dan lambda yang menjelaskan cara memasukkan nilai. Berikut dokumentasinya:

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

Saya bertanya-tanya mengapa tidak ada yang memberikan jawaban yang paling sederhana:

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

Sesuai salah satu komentar untuk jawaban asli saya, saya menyadari ini hanya berfungsi ketika digunakan dalam argumen anotasi (yang benar-benar tidak terduga bagi saya).

Sepertinya Kotlin tidak memungkinkan untuk membuat literal array di luar anotasi.

Misalnya, lihat kode ini menggunakan @Opsi dari pustaka args4j:

    @Pilihan(
        name = "-h",
        alias = ["--help", "-?"],
        use = "Tunjukkan bantuan ini"
    )
    var help: Boolean = false

Argumen opsi "alias" adalah tipe Array<String>


2
Saya mendapatkan kesalahan berikut dengan kode ini: Tidak didukung [Koleksi literal di luar anotasi]
Rémi P

Saya belum pernah melihat ini sebelumnya. Apakah sintaks ini baru untuk Kotlin?
Lars Blumberg

@ LarsBlumberg, mungkin, saya baru saja mulai menggunakan Kotlin baru-baru ini dengan IntelliJ 2019.1 dan saya menginisialisasi array string seperti yang saya perlihatkan dan berhasil
hdkrus

@ RémiP, Poin bagus, saya menggunakannya pada argumen anotasi. Tetapi itu berarti bahwa literal array berfungsi dalam beberapa konteks dan dalam beberapa lainnya tidak?
hdkrus

1
@ hdkrus Mengapa Anda tidak memperbarui jawaban Anda untuk menunjukkan bagaimana inisialisasi array bekerja dengan anotasi? Ini dapat bermanfaat bagi banyak pembaca pertanyaan ini.
Lars Blumberg

1

Dalam kasus saya, saya perlu menginisialisasi item laci saya. Saya mengisi data dengan kode di bawah ini.

    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)

Kelas Model Kustom-

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

}

Ini tidak benar-benar menjawab pertanyaan dengan cara yang masuk akal.
Qwerp-Derp

Silakan periksa komentar di mana saya menggunakan fungsi lambda untuk menambahkan item.
Rahul

Ini masih tampak seperti cara yang berbelit-belit untuk menyelesaikan masalah ini, setidaknya dibandingkan dengan jawaban lainnya. Saya juga melihat pesan saya sebelumnya, dan tampaknya sulit dalam retrospeksi - saya minta maaf.
Qwerp-Derp

Itu baik, tidak masalah. Saya hanya mencoba menjawab dengan cara yang menyelesaikan masalah saya, saya tidak membandingkan dengan jawaban lain. Terima kasih!
Rahul

1

Deklarasikan array int di global

var numbers= intArrayOf()

Metode onCreate berikutnya menginisialisasi array Anda dengan nilai

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

Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya.
rollstuhlfahrer

1

Di Jawa array dapat diinisialisasi seperti:

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

Tetapi Di Kotlin, sebuah array diinisialisasi dengan banyak cara seperti:

Setiap jenis array generik yang dapat Anda gunakan fungsi arrayOf () :

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

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

Menggunakan fungsi utilitas Kotlin, sebuah array dapat diinisialisasi

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

1

Cara sederhana:

Untuk Integer:

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

Tahan Semua tipe data

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


0

intialize array dengan cara ini: val paramValueList : Array<String?> = arrayOfNulls<String>(5)


0

Dengan cara ini, Anda dapat menginisialisasi array int di koltin.

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

Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
leopal

0

Jawaban saya melengkapi @maroun ini adalah beberapa cara untuk menginisialisasi array:

Gunakan array

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

Gunakan array yang ketat

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

Campur jenis matriks

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

Array bersarang

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

Kemampuan untuk memulai dengan kode dinamis

val numbers = Array(5){ it*2}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.