Документация несколько скрывает ответ. Вместо того, чтобы приводить пример исходного кода, они упоминают (устаревшую) array()функцию в дополнительном комментарии: чтобы создать массив, мы можем использовать библиотечную функцию array () и передать ей значения элементов, чтобы массив (1, 2, 3) ) создает массив [1, 2, 3].
Ларс Блумберг
8
Хотя мне нравится Kotlin, но я сказал, что «документация Kotlin» недостаточно хороша (я узнал больше на других сайтах, чем kotlinlang.org).
Хасан Тарек
1
Также иногда вы просто хотите использовать intRange, val numbers = 1..5который дает диапазон от 1 до 5.
Это предпочтительнее использовать 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 Nval arr =IntArray(N)// Array of integers of a size of N initialized with a default value of 2val arr =IntArray(N){ i ->2}
Второе значение по умолчанию 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);}}
Вы также можете использовать игровую площадку для проверки языковых возможностей.
Это помогает , если вы привести примеры для 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
Я думаю, что одна вещь, о которой стоит упомянуть и которая недостаточно понятна из документации, заключается в том, что когда вы используете фабричную функцию для создания массива и указываете его размер, массив инициализируется со значениями, равными значениям их индекса. Например, в массиве , например , как это:
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"]
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.
*/publicclassIntArray(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)...}
Вы можете просто использовать существующие стандартные методы библиотеки, как показано здесь:
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)
Мне интересно, почему никто просто не дал самые простые ответы:
val array:Array<Int>=[1,2,3]
Согласно одному из комментариев к моему первоначальному ответу, я понял, что это работает только при использовании в аргументах аннотаций (что было действительно неожиданно для меня).
Похоже, Kotlin не позволяет создавать литералы массива вне аннотаций.
Например, посмотрите на этот код, используя @Option из библиотеки args4j:
@option (
name = "-h",
aliases = ["--help", "-?"],
Использование = "Показать эту помощь"
)
var help: Boolean = false
Аргумент опции "псевдонимы" имеет тип Array<String>
Я получил следующую ошибку с этим кодом: 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. DrawerItemval drawerItems =Array<DrawerItem>(iconsArr.size,init={ index ->DrawerItem(iconsArr[index], names[index])})Log.d(LOGGER_TAG,"Number of items in drawer is: "+ drawerItems.size)
Это на самом деле не дает разумного ответа на вопрос.
Qwerp-
Пожалуйста, проверьте комментарий, в котором я использовал лямбда-функцию для добавления элементов.
Рахул
Это все еще кажется запутанным способом решения этой проблемы, по крайней мере, по сравнению с другими ответами. Также я посмотрел на мое предыдущее сообщение, и оно кажется грубым в ретроспективе - извините.
Qwerp-
Это нормально, не проблема. Я просто пытался ответить таким образом, чтобы решить мою проблему, я не сравнивал с другими ответами. Спасибо!
Рахул
1
Объявите массив int в глобальном
var numbers= intArrayOf()
следующий метод onCreate инициализирует ваш массив значением
overridefun 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 можно инициализировать массив
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
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))
array()
функцию в дополнительном комментарии: чтобы создать массив, мы можем использовать библиотечную функцию array () и передать ей значения элементов, чтобы массив (1, 2, 3) ) создает массив [1, 2, 3].val numbers = 1..5
который дает диапазон от 1 до 5.Ответы:
Смотрите Kotlin - Основные типы для деталей.
Вы также можете предоставить функцию инициализатора в качестве второго параметра:
источник
intArrayOf
болееarrayOf
? Таким образом,IntArray
имеет преимущества передArray<Int>
?listOf(10, 20, 30, 40, 50)
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage
. Я используюjdk1.8.0_241
и Intellij IDEAСтоит отметить, что при использовании встроенных средств kotlin (например
intArrayOf()
,longArrayOf()
иarrayOf()
т. Д.) Вы не можете инициализировать массив значениями по умолчанию (или всеми значениями до желаемого значения) для данного размера, вместо этого вам нужно выполнить инициализацию посредством вызова в соответствии с конструктором класса ,источник
IntArray(N) {i -> 2}
и даже (при инициализации с константой)IntArray(N) {2}
Вот пример:
Вы также можете использовать игровую площадку для проверки языковых возможностей.
источник
В Котлине есть несколько способов.
Затем просто начальное значение от пользователей или из другой коллекции или где вы хотите.
Мы также можем создать массив со встроенной функцией
По-другому
Вы также можете использовать
doubleArrayOf()
илиDoubleArray()
или любой примитивный тип вместо Int.источник
var arr = IntArray(size, { it * 1 } )
так же , какvar arr = IntArray(size){it}
В Котлин мы можем создать массив , используя
arrayOf()
,intArrayOf()
,charArrayOf()
,booleanArrayOf()
,longArrayOf()
функции.Например:
источник
Старый вопрос, но если вы хотите использовать диапазон:
Дает почти такой же результат, как:
результат: 10, 20, 30, 40, 50
Я думаю, что первый вариант немного более читабелен. Оба работают.
источник
Вы можете использовать эти методы
пример
init представляет значение по умолчанию (инициализация)
источник
init
вArray<Int>()
иIntArray()
ваш ответ не очень полезно , как сейчас.Котлин язык специализированные классов для представления массивов примитивных типов без бокса накладных расходов: например , -
IntArray
,ShortArray
,ByteArray
и т.д. Я должен сказать , что эти классы не имеют наследования отношения к родительскомуArray
классу, но они имеют один и тот же набор методов и свойств. Каждый из них также имеет соответствующую заводскую функцию. Итак, чтобы инициализировать массив со значениями в Kotlin, вам просто нужно напечатать это:... или так:
Теперь вы можете использовать его:
Надеюсь это поможет.
источник
Я думаю, что одна вещь, о которой стоит упомянуть и которая недостаточно понятна из документации, заключается в том, что когда вы используете фабричную функцию для создания массива и указываете его размер, массив инициализируется со значениями, равными значениям их индекса. Например, в массиве , например , как это:
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"]
источник
Вы можете создать Int Array следующим образом:
5 - размер массива Int. лямбда-функция является функцией init элемента. диапазон 'it' в [0,4], плюс 1 диапазон в [1,5]
Функция происхождения:
Класс IntArray, определенный в Arrays.kt
источник
Вы можете попробовать это:
источник
Вы можете просто использовать существующие стандартные методы библиотеки, как показано здесь:
Возможно, имеет смысл использовать специальный конструктор:
Вы передаете размер и лямбду, которая описывает, как инициировать значения. Вот документация:
источник
Мне интересно, почему никто просто не дал самые простые ответы:Согласно одному из комментариев к моему первоначальному ответу, я понял, что это работает только при использовании в аргументах аннотаций (что было действительно неожиданно для меня).
Похоже, Kotlin не позволяет создавать литералы массива вне аннотаций.
Например, посмотрите на этот код, используя @Option из библиотеки args4j:
Аргумент опции "псевдонимы" имеет тип
Array<String>
источник
В моем случае мне нужно инициализировать элементы ящика. Я заполняю данные кодом ниже.
Пользовательская модель
источник
Объявите массив int в глобальном
следующий метод onCreate инициализирует ваш массив значением
источник
В Java массив может быть инициализирован, например:
Но в Kotlin массив инициализируется многими способами, такими как:
Любой универсальный тип массива вы можете использовать функцию arrayOf () :
С помощью служебных функций Kotlin можно инициализировать массив
источник
Простой способ:
Для целых чисел:
var number = arrayOf <Int> (10, 20, 30, 40, 50)
Hold All типы данных
var number = arrayOf (10, «строковое значение», 10.5)
источник
инициализировать массив следующим образом:
val paramValueList : Array<String?> = arrayOfNulls<String>(5)
источник
Таким образом, вы можете инициализировать массив int в koltin.
источник
Мой ответ дополняет @maroun, вот несколько способов инициализации массива:
Использовать массив
Используйте строгий массив
Смешайте типы матриц
Вложенные массивы
Возможность начать с динамического кода
источник