如何在Kotlin中使用值初始化数组?


261

在Java中,可以初始化数组,例如:

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

Kotlin的数组初始化如何?



6
该文档在某种程度上隐藏了答案。他们没有提供源代码示例,而是array()在侧面注释中提到了(不建议使用的)函数:要创建数组,我们可以使用库函数array()并将项目值传递给它,以便array(1、2、3 )创建一个数组[1、2、3]。
Lars Blumberg 2015年

8
尽管我喜欢Kotlin,但是我说过“ Kotlin文档”还不够好(我从kotlinlang.org上从其他站点中学到了更多)。
哈桑·塔雷克

1
也有时你只想要一个intRange你可以这样做:val numbers = 1..5这给从1到5的范围INT
Sylhare

Answers:


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

有关详细信息,请参见Kotlin-基本类型

您还可以提供一个初始化函数作为第二个参数:

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

8
它是最好使用intArrayOfarrayOf?这样IntArray有没有优势Array<Int>呢?
Lars Blumberg 2015年

16
@LarsBlumberg IntArray等于int [],Array <Int>与Integer []相同
user2235698 2015年

3
初始化列表非常相似:listOf(10, 20, 30, 40, 50)
Cristan

当我使用intArrayOf()函数时,我面对Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage。我正在使用jdk1.8.0_241Intellij IDEA
TeachMeJava

92

值得一提的是,使用科特林builtines时(例如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
使用lambda的第二个默认值init非常有用!谢谢
rf43

9
初始化的第二种形式可以写成:IntArray(N) {i -> 2}甚至(使用常量初始化时)IntArray(N) {2}
David Soroko '18年

1
代替我,我们可以使用“ _” var arr = IntArray(N){_-> false}
Navas pk

1
带有lambda的那个正是我要初始化一个具有动态大小和非可选默认值的数组所需要的。谢谢!
mithunc

48

这是一个例子:

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

您还可以使用游乐场来测试语言功能。


2
一个注释,要输出数组的值,我们可以使用array.joinToString(“”)代替循环。
anticafe

2
可以工作,但看起来比用Kotlin写的用Kotlin写的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代表默认值(initialize)


1
如果您initArray<Int>()和中提供示例,IntArray()这会有所帮助,到目前为止,您的答案并没有太大帮助。
拉尔斯·布伦伯格

答案已被修改
阿里·哈桑

Array <Int>给您一个装箱的整数数组,而IntArray给您一个实际的int数组。
迈克,

4

科特林语言有专门的类来表示基本类型数组无开销拳击:例如- ,,IntArray 等我需要说的是,这些类没有继承关系的父类,但它们具有相同的一套方法和属性。它们每个还具有相应的工厂功能。因此,要在Kotlin中使用值初始化数组,只需输入以下内容:ShortArrayByteArrayArray

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的大小。lambda函数是元素初始化函数。[0,4]中的'it'范围,以及[1,5]中的1个make范围

起源函数是:

 /**
 * 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中定义的IntArray类



2

您可以简单地使用现有的标准库方法,如下所示:

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

不过,使用特殊的构造函数可能很有意义:

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

您传递一个大小和一个lambda,以描述如何初始化值。这里是文档:

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

根据对我的原始答案的评论之一,我意识到这仅在注释参数中使用时有效(这对我来说确实是出乎意料的)。

看起来Kotlin不允许在注释之外创建数组文字。

例如,使用args4j库中的@Option查看以下代码:

    @选项(
        名称=“ -h”,
        别名= [“ --help”,“-?”],
        usage =“显示此帮助”
    )
    var help:布尔=假

选项参数“别名”的类型 Array<String>


2
我有以下错误使用此代码:不支持[收藏文字注解之外]
雷米P

我以前没看过 这是Kotlin的新语法吗?
Lars Blumberg

@LarsBlumberg,可能是,我最近刚开始在IntelliJ 2019.1中使用Kotlin,并且初始化了一个字符串数组,就像我展示的那样并起作用了
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

请检查我使用lambda函数添加项目的注释。
拉胡尔

至少与其他答案相比,这似乎仍然是解决该问题的复杂方法。我也看了我以前的信息,回想起来似乎很刺耳-对不起。
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)



0

这样,您可以在koltin中初始化int数组。

 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}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.