Как инициализировать массив в Kotlin значениями?

261

В Java массив может быть инициализирован, например:

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

Как выглядит инициализация массива Kotlin?

Ларс Блумберг
источник
Может быть, просто взгляните на документы: kotlinlang.org/docs/reference/basic-types.html
khlr
6
Документация несколько скрывает ответ. Вместо того, чтобы приводить пример исходного кода, они упоминают (устаревшую) array()функцию в дополнительном комментарии: чтобы создать массив, мы можем использовать библиотечную функцию array () и передать ей значения элементов, чтобы массив (1, 2, 3) ) создает массив [1, 2, 3].
Ларс Блумберг
8
Хотя мне нравится Kotlin, но я сказал, что «документация Kotlin» недостаточно хороша (я узнал больше на других сайтах, чем kotlinlang.org).
Хасан Тарек
1
Также иногда вы просто хотите использовать intRange, val numbers = 1..5который дает диапазон от 1 до 5.
Sylhare

Ответы:

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

Смотрите Kotlin - Основные типы для деталей.

Вы также можете предоставить функцию инициализатора в качестве второго параметра:

val numbers = IntArray(5) { 10 * (it + 1) }
// [10, 20, 30, 40, 50]
Марун
источник
9
Это предпочтительнее использовать intArrayOfболее arrayOf? Таким образом, IntArrayимеет преимущества перед Array<Int>?
Ларс Блумберг
17
@LarsBlumberg IntArray равно int [], Array <Int> совпадает с Integer []
user2235698
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

Стоит отметить, что при использовании встроенных средств kotlin (например 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);
    }
}

Вы также можете использовать игровую площадку для проверки языковых возможностей.

shadeglare
источник
3
Один комментарий, чтобы вывести значение массива, мы можем использовать array.joinToString ("") вместо цикла.
Антифафе
2
Работает, но выглядит больше Java написана на Kotlin, чем идиоматический Kotlin :)
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.

HM Nayem
источник
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()ваш ответ не очень полезно , как сейчас.
Ларс Блумберг
Ответ был изменен
Али
Array <Int> дает вам массив упакованных целых чисел, тогда как 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. лямбда-функция является функцией 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

Zyc Zyc
источник
2

Вы можете попробовать это:

var a = Array<Int>(5){0}
kulst
источник
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)
s1m0nw1
источник
2

Мне интересно, почему никто просто не дал самые простые ответы:

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

Согласно одному из комментариев к моему первоначальному ответу, я понял, что это работает только при использовании в аргументах аннотаций (что было действительно неожиданно для меня).

Похоже, Kotlin не позволяет создавать литералы массива вне аннотаций.

Например, посмотрите на этот код, используя @Option из библиотеки args4j:

    @option (
        name = "-h",
        aliases = ["--help", "-?"],
        Использование = "Показать эту помощь"
    )
    var help: Boolean = false

Аргумент опции "псевдонимы" имеет тип Array<String>

hdkrus
источник
2
Я получил следующую ошибку с этим кодом: Unsupported [Коллекционные литералы вне аннотаций]
Rémi P
Я не видел этого раньше. Этот синтаксис является новым для Kotlin?
Ларс Блумберг
@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-
Пожалуйста, проверьте комментарий, в котором я использовал лямбда-функцию для добавления элементов.
Рахул
Это все еще кажется запутанным способом решения этой проблемы, по крайней мере, по сравнению с другими ответами. Также я посмотрел на мое предыдущее сообщение, и оно кажется грубым в ретроспективе - извините.
Qwerp-
Это нормально, не проблема. Я просто пытался ответить таким образом, чтобы решить мою проблему, я не сравнивал с другими ответами. Спасибо!
Рахул
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)

Hold All типы данных

var number = arrayOf (10, «строковое значение», 10.5)

Зафар Икбал
источник
0

инициализировать массив следующим образом: val paramValueList : Array<String?> = arrayOfNulls<String>(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}
Fahed Hermoza
источник