Як ініціалізувати масив у Kotlin зі значеннями?


261

У Java масив може бути ініціалізований, наприклад:

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

Як виглядає ініціалізація масиву Котліна?


Можливо, просто подивіться на документи: kotlinlang.org/docs/reference/basic-types.html
khlr

6
Документація дещо приховує відповідь. Замість того, щоб наводити приклад вихідного коду, вони згадують функцію (застарілу) array()у коментарях з боку: Щоб створити масив, ми можемо використовувати масив функції бібліотеки () та передавати йому значення елементів, так що масив (1, 2, 3 ) створює масив [1, 2, 3].
Ларс Блюмберг

8
Хоча мені подобається Котлін, але я кажу, що "документація Котліна" недостатньо хороша (я дізнався більше з інших сайтів, ніж kotlinlang.org).
Хасан Тарек

1
Крім того, коли ви просто хочете зробити intRange, який ви могли зробити: val numbers = 1..5це дає діапазон інт від 1 до 5.
Sylhare

Відповіді:


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

Детальніше див. У розділі Котлін - Основні типи .

Ви також можете надати функцію ініціалізатора як другий параметр:

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

8
Чи бажано використовувати intArrayOfнад arrayOf? Таким чином, IntArrayмає переваги перед Array<Int>?
Ларс Блюмберг

16
@LarsBlumberg IntArray дорівнює int [], Array <Int> - це те саме, що Integer []
користувач2235698

3
Ініціалізація списку дуже схожа:listOf(10, 20, 30, 40, 50)
Cristan

Коли я використовую функцію intArrayOf (), я стикаюся Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage. Я використовую jdk1.8.0_241і Intellij IDEA
TeachMeJava

92

Варто зазначити, що при використанні котлінових будівельних будівель (наприклад intArrayOf(),longArrayOf() , arrayOf()і т.д.) , ви не можете ініціалізувати масив зі значеннями за замовчуванням (або всі значення до необхідного значення) для заданого розміру, а вам потрібно зробити ініціалізації з допомогою виклику в відповідно до конструктором класу .

// 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
Це друге значення за замовчуванням init за допомогою лямбда було дуже корисним! Спасибі
rf43

9
Друга форма ініціалізації може бути записана як: IntArray(N) {i -> 2}і навіть (при ініціалізації з константою)IntArray(N) {2}
Девід Сороко

1
Замість i ми можемо використовувати "_" var arr = IntArray (N) {_ -> false}
Navas pk

1
Саме з лямбда було саме те, що мені потрібно було відкрити масив з динамічним розміром і необов'язковим значенням за замовчуванням. Дякую!
mithunc

48

Ось приклад:

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

Ви також можете використовувати ігровий майданчик для тестування функцій мови.


2
Один коментар, щоб надрукувати значення масиву, ми можемо використовувати array.joinToString ("") замість циклу.
антикафе

2
Працює, але виглядає більше Java, написаної в Котліні, ніж ідіоматичний Котлін :)
m0skit0

47

У Котліні є кілька способів.

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

Тоді просто початкове значення у користувачів або з іншої колекції або де завгодно.

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

Ми також можемо створити масив із вбудованою функцією типу-

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

Інший спосіб

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.

Ви також можете використовувати doubleArrayOf()або DoubleArray()будь-який примітивний тип замість Int.


var arr = IntArray(size, { it * 1 } )те саме, щоvar arr = IntArray(size){it}
Det

30

У Котлин ми можемо створити масив , використовуючи arrayOf(), intArrayOf(), charArrayOf(), booleanArrayOf(), longArrayOf()функції.

Наприклад:

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)  

Будь ласка, переформатуйте цю відповідь, щоб було зрозуміло, що таке код і що є коментарем.

6

Старе питання, але якщо ви хочете використовувати діапазон:

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

Урожайність майже такий же результат, як:

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

результат: 10, 20, 30, 40, 50

Я думаю, що перший варіант - трохи читабельніший. Обидва працюють.


5

можна використовувати ці методи

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

приклад

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

init представляє значення за замовчуванням (ініціалізувати)


1
Це допомагає , якщо ви навести приклади для initв Array<Int>()і IntArray()ваш відповідь не дуже корисно , як зараз.
Ларс Блюмберг

Відповідь була змінена
Алі Хасан

Масив <Int> надає вам масив коробкових Integers, тоді як IntArray отримує фактичний масив Int.
Майк

4

Котлін мову спеціалізовані класів для подання масивів примітивних типів без боксу накладних витрат: наприклад , - IntArray, ShortArray, ByteArrayі т.д. Я повинен сказати , що ці класи не мають успадкування відносини до батьківського Arrayкласу, але вони мають один і той же набір методів і властивостей. Кожен з них також має відповідну заводську функцію. Отже, щоб ініціалізувати масив зі значеннями у Kotlin, вам просто потрібно набрати це:

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

... або таким чином:

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

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

Тепер ви можете використовувати його:

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

Сподіваюсь, це допомагає.


3

Я думаю, що одне, що варто згадати і недостатньо інтуїтивно зрозуміле з документації, - це те, що коли ви використовуєте заводську функцію для створення масиву і вказуєте його розмір, масив ініціалізується зі значеннями, що дорівнюють їх індексу. Наприклад, в масиві , наприклад , як це: val array = Array(5, { i -> i })початкові значення , що привласнюються є [0,1,2,3,4]і не говорять, [0,0,0,0,0]. Ось чому з документації val asc = Array(5, { i -> (i * i).toString() })виробляється відповідь["0", "1", "4", "9", "16"]


3

Ви можете створити Int Array таким чином:

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

5 - розмір Int Array. функція лямбда - це функція елемента init. Діапазон 'it' в [0,4] плюс 1 зробити діапазон у [1,5]

функція початку:

 /**
 * 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 визначений у Arrays.kt



2

Ви можете просто використовувати існуючі стандартні методи бібліотеки, як показано тут:

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

Можливо, є сенс використовувати спеціальний конструктор:

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

Ви передаєте розмір і лямбда, що описують, як викликати значення. Ось документація:

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

Мені цікаво, чому ніхто просто не дав найпростіших відповідей:

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

Згідно з одним із коментарів до моєї оригінальної відповіді, я зрозумів, що це працює лише тоді, коли використовується в аргументах анотацій (що було для мене справді несподівано).

Схоже, що Котлін не дозволяє створювати літерали масиву поза анотаціями.

Наприклад, подивіться на цей код за допомогою @Option з бібліотеки args4j:

    @ Опція (
        name = "-h",
        псевдоніми = ["--help", "-?"],
        use = "Показати цю допомогу"
    )
    var help: булева = хибна

Аргумент параметра "псевдоніми" має тип Array<String>


2
У мене з’явилася така помилка з цим кодом: Непідтримувана [
Rémi P

Я цього раніше не бачив. Цей синтаксис є новим для Котліна?
Ларс Блюмберг

@LarsBlumberg, напевно, я нещодавно почав використовувати Kotlin нещодавно з IntelliJ 2019.1, і я ініціалізував рядковий масив так само, як я показав, і він працював
hdkrus

@ RémiP, Добре, я використовував це на аргументах анотацій. Але це означатиме, що літерали масиву працюють у деяких контекстах, а в інших - ні?
hdkrus

1
@hdkrus Чому ви не оновите свою відповідь, щоб показати, як працює ініціалізація масиву з примітками? Це може бути корисним для багатьох читачів цих питань.
Ларс Блюмберг

1

У моєму випадку мені потрібно ініціалізувати елементи ящика. Я заповнюю дані нижче кодом.

    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)

Спеціальна модель -

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

}

Це насправді не дає відповіді на питання розумним чином.
Qwerp-Derp

Перевірте коментар, у якому я використовував функцію лямбда для додавання елементів.
Рахул

Це все ще здається спірним способом вирішення цієї проблеми, принаймні порівняно з іншими відповідями. Також я переглянув своє попереднє повідомлення, і це здається суворим за ретроспективою - вибачте.
Qwerp-Derp

Це добре, жодне питання. Я просто намагався відповісти так, як це вирішило мою проблему, я не порівнював її з іншими відповідями. Дякую!
Рахул

1

Оголосити масив int на глобальному рівні

var numbers= intArrayOf()

наступний метод onCreate ініціалізувати масив зі значенням

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

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
rollstuhlfahrer

1

У Java масив може бути ініціалізований, наприклад:

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

Але в Kotlin масив ініціалізувався багатьма способами, такими як:

Будь-який загальний тип масиву, який ви можете використовувати функцію arrayOf () :

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

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

За допомогою корисних функцій Kotlin масив можна ініціалізувати

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

1

Простий спосіб:

Для цілого:

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

Утримуйте всі типи даних

var number = arrayOf (10, "значення рядка", 10.5)



0

Таким чином, ви можете ініціалізувати масив int у koltin.

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

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
leopal

0

Моя відповідь доповнює @maroun. Це кілька способів ініціалізації масиву:

Використовуйте масив

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

Використовуйте суворий масив

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

Змішайте види матриць

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

Гніздові масиви

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

Можливість почати з динамічного коду

val numbers = Array(5){ it*2}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.