Kotlin'de bir dizi değerlerle nasıl başlatılır?


261

Java'da bir dizi başlatılabilir, örneğin:

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

Kotlin'in dizi başlatması nasıl görünüyor?


Belki sadece dokümanlara bir göz atın: kotlinlang.org/docs/reference/basic-types.html
khlr

6
Belgeler cevabı biraz gizliyor. Bir kaynak kod örneği vermek yerine, array()bir kenar yorumunda (kullanımdan kaldırıldı) işlevinden bahsediyorlar : Bir dizi oluşturmak için, bir kütüphane işlevi dizisi () kullanabilir ve öğe değerlerini ona aktarabiliriz, böylece dizi (1, 2, 3) ) bir dizi oluşturur [1, 2, 3].
Lars Blumberg

8
Kotlin'i sevmeme rağmen "Kotlin belgeleri" nin yeterince iyi olmadığını söyledim (kotlinlang.org'dan başka sitelerden daha fazla şey öğrendim).
Hassan Tareq

1
Ayrıca bazen yapabileceğiniz bir intRange istersiniz: val numbers = 1..51 ila 5 arasında bir int aralığı verir
Sylhare

Yanıtlar:


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

Ayrıntılar için Kotlin - Temel Tipler bölümüne bakınız.

İkinci parametre olarak bir başlatıcı işlevi de sağlayabilirsiniz:

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

9
intArrayOfAşırı kullanımı tercih edilir arrayOfmi? Böylece IntArrayavantajları var Array<Int>mı?
Lars Blumberg

17
@LarsBlumberg IntArray int [] değerine eşittir, Array <Int> Tamsayı [] ile aynıdır
user2235698

3
Bir listeyi başlatmak çok benzer:listOf(10, 20, 30, 40, 50)
Cristan

İntArrayOf () işlevini kullanırken yüzleşiyorum Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage. Ben kullanıyorum jdk1.8.0_241ve Intellij IDEA
TeachMeJava

92

Worth KOTLIN builtines kullanırken (örneğin söz intArrayOf(), longArrayOf(), arrayOf(), vs) Eğer sınıf yapıcısı göre telefonla, initialize yapmanız gereken bunun yerine, belirli bir boyut için varsayılan değerlerle diziyi (veya istenilen değere tüm değerleri) başlatmak mümkün değildir .

// 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
Lambda kullanarak ikinci varsayılan değer init süper yararlı oldu! Teşekkürler
rf43

9
İkinci başlatma şekli şu şekilde yazılabilir: IntArray(N) {i -> 2}ve hatta (bir sabitle başlatırken)IntArray(N) {2}
David Soroko

1
İ yerine "_" kullanabiliriz var arr = IntArray (N) {_ -> false}
Navas pk

1
Lambda ile bir tam olarak dinamik boyutu ve isteğe bağlı olmayan varsayılan değeri olan bir dizi başlatmak için gereken buydu. Teşekkürler!
mithunc

48

İşte bir örnek:

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

Dil özelliklerini test etmek için bir oyun alanı da kullanabilirsiniz .


3
Bir yorum, bir dizinin değerini yazdırmak için döngü yerine array.joinToString ("") kullanabiliriz.
anticafe

2
Çalışır ama
Kotlin'de

47

Kotlin'de birkaç yol var.

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

Ardından, kullanıcılardan veya başka bir koleksiyondan veya istediğiniz herhangi bir yerden başlangıç ​​değeri.

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

Ayrıca dahili fonksiyon ile dizi oluşturabiliriz-

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

Diğer yol

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.

Ayrıca Int yerine doubleArrayOf()veya DoubleArray()veya herhangi bir ilkel türü de kullanabilirsiniz .


var arr = IntArray(size, { it * 1 } )ile aynıvar arr = IntArray(size){it}
Det

30

KOTLIN biz kullanarak diziyi oluşturabilir arrayOf(), intArrayOf(), charArrayOf(), booleanArrayOf(), longArrayOf()işlevleri.

Örneğin:

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)  

Lütfen bu Cevabı yeniden biçimlendirin, böylece kodun ve yorumun ne olduğu açıktır.

6

Eski soru, ancak bir aralık kullanmak istiyorsanız:

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

Neredeyse aynı sonucu verir:

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

sonuç: 10, 20, 30, 40, 50

Bence ilk seçenek biraz daha okunabilir. Her ikisi de çalışır.


5

bu yöntemleri kullanabilirsiniz

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

misal

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

init varsayılan değeri temsil eder (başlat)


1
Bu örnekler verirsen yardımcı olur initiçinde Array<Int>()ve IntArray()cevap şimdi kadarını yararlı değildir.
Lars Blumberg

Cevap değiştirildi
Ali hasan

Array <Int> size kutulu bir Tamsayı dizisi verirken IntArray size gerçek bir int dizisi verir.
Mike

4

- örneği için: Kotlin dil havai boks olmadan ilkel türleri dizileri temsil edilmesi için sınıfları uzman olan IntArray, ShortArray, ByteArrayvb ben gerek bu sınıflar ebeveyn için hiçbir miras ilişkisi olduğunu söylemek Arraysınıfın, ancak yöntemleri ve özellikleri aynı dizi var. Her birinin de karşılık gelen bir fabrika işlevi vardır. Yani, Kotlin'deki değerlerle bir dizi başlatmak için sadece şunu yazmanız gerekir:

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

... ya da şu şekilde:

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

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

Şimdi kullanabilirsiniz:

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

Bu yardımcı olur umarım.


3

Bahsetmeye değer ve belgelerden yeterince sezgisel olmayan bir şey, bir dizi oluşturmak için bir fabrika işlevini kullandığınızda ve boyutunu belirttiğinizde, dizinin dizin değerlerine eşit değerlerle başlatıldığıdır. Örneğin, şu gibi bir dizide: val array = Array(5, { i -> i })atanan ilk değerler [0,1,2,3,4], diyelim, değil [0,0,0,0,0]. Belgelerinden, nedeni budur val asc = Array(5, { i -> (i * i).toString() })bir cevap üretir["0", "1", "4", "9", "16"]


3

Bunun gibi bir Int Array oluşturabilirsiniz:

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

5, Int Array boyutudur. lambda fonksiyonu eleman init fonksiyonudur. 'it' [0,4] aralığında artı 1 [1,5] aralığında olur

origin işlevi:

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

Arrays.kt içinde tanımlanan IntArray sınıfı


2

Bunu deneyebilirsiniz:

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

2

Mevcut standart kütüphane yöntemlerini burada gösterildiği gibi kullanabilirsiniz :

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

Yine de özel bir kurucu kullanmak mantıklı olabilir:

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

Bir boyut ve değerlerin nasıl başlatılacağını açıklayan bir lambda iletirsiniz. İşte belgeler:

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

Kimsenin neden en basit cevapları vermediğini merak ediyorum:

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

Orijinal cevabımın yorumlarından birine göre, bunun sadece ek açıklama argümanlarında (benim için gerçekten beklenmedikti) kullanıldığında işe yaradığını fark ettim.

Kotlin, ek açıklamaların dışında dizi değişmezleri oluşturmaya izin vermiyor gibi görünüyor.

Örneğin, args4j kütüphanesinden @ Seçenek kullanarak bu koda bakın:

    @Option (
        name = "-h",
        takma adlar = ["--help", "-?"],
        usage = "Bu yardımı göster"
    )
    var help: Boolean = yanlış

"Takma ad" seçenek bağımsız değişkeni türdedir Array<String>


2
Bu kodla aşağıdaki hatayı aldım: Desteklenmeyen [Ek açıklamaların dışındaki
Rémi P

Bunu daha önce görmedim. Bu sözdizimi Kotlin için yeni mi?
Lars Blumberg

@LarsBlumberg, muhtemelen, Kotlin'i yakın zamanda IntelliJ 2019.1 ile kullanmaya başladım ve tıpkı gösterdiğim gibi bir dize dizisi başlattım ve çalıştı
hdkrus

@ RémiP, İyi bir nokta, bunu ek açıklama argümanlarında kullandım. Ancak bu, dizi değişmezlerinin bazı bağlamlarda çalıştığı ve bazılarının çalışmadığı anlamına gelir mi?
hdkrus

1
@hdkrus Dizi başlatmanın ek açıklamalarla nasıl çalıştığını göstermek için cevabınızı neden güncellemiyorsunuz? Bu, bu soruların birçok okuyucusu için değerli olabilir.
Lars Blumberg

1

Benim durumumda çekmece eşyalarımı başlatmam gerekiyor. Aşağıdaki kod ile veri dolduruyorum.

    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)

Özel Model sınıfı

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

}

Bu soruya mantıklı bir şekilde cevap vermiyor.
Qwerp-Derp

Lütfen öğeleri eklemek için lambda işlevini kullandığım yorumu kontrol edin.
Rahul

Bu hala, en azından diğer cevaplara kıyasla, bu sorunu çözmek için kıvrımlı bir yol gibi görünüyor. Ayrıca önceki iletime baktım ve geçmişe bakıldığında sert görünüyor - özür dilerim.
Qwerp-Derp

Sorun yok, sorun değil. Sorunumu çözecek şekilde cevap vermeye çalıştım, diğer cevaplarla karşılaştırmadım. Teşekkür ederim!
Rahul

1

İnt dizisini global olarak bildir

var numbers= intArrayOf()

next onCreate yöntemi dizinizi değerle başlatır

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

Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
rollstuhlfahrer

1

Java'da bir dizi başlatılabilir, örneğin:

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

Ancak Kotlin'de bir dizi şu gibi birçok yol başlattı:

ArrayOf () işlevini kullanabileceğiniz herhangi bir genel dizi türü :

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

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

Kotlin'in yardımcı fonksiyonlarını kullanarak bir dizi başlatılabilir

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

1

Basit yol:

Tamsayı için:

var sayı = diziOf <Int> (10, 20, 30, 40, 50)

Tüm veri türlerini tut

var number = arrayOf (10, "dize değeri", 10.5)


0

diziyi şu şekilde başlatın: val paramValueList : Array<String?> = arrayOfNulls<String>(5)


0

Bu yolla koltin'de int dizisini başlatabilirsiniz.

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

Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
leopar

0

Cevabım @maroun'u tamamlar, bunlar bir diziyi başlatmanın bazı yollarıdır:

Dizi kullanma

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

Katı bir dizi kullanın

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

Karışık matris türleri

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

Dizileri yerleştirme

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

Dinamik kod ile başlayabilme

val numbers = Array(5){ it*2}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.