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

402

在Java中,可以像这样初始化数组:

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

Kotlin的数组初始化是什么样子的?


也许只需要查看文档:http://kotlinlang.org/docs/reference/basic-types.html - Jan Köhler
7
文档有点掩盖了答案。他们在旁注中提到(被弃用的)array()函数,而不是给出源代码示例:为了创建一个数组,我们可以使用库函数array(),并将项目值传递给它,这样array(1, 2, 3)将创建一个数组 [1, 2, 3] - Lars Blumberg
8
虽然我喜欢 Kotlin,但我必须说“Kotlin 文档”不够好(我从其他网站上学到的比 kotlinlang.org 更多)。 - MD TAREQ HASSAN
1
有时候你只需要一个 intRange,你可以这样做:val numbers = 1..5,它会给出从 1 到 5 的整数范围。 - Sylhare
27个回答

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

详情请参见Kotlin - 基本类型

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

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

12
使用intArrayOf而不是arrayOf是否更好?因此,IntArrayArray<Int>有什么优势? - Lars Blumberg
30
IntArray 等同于 int[],Array<Int> 等同于 Integer[]。 - user2235698
4
初始化一个列表的方法非常类似:listOf(10, 20, 30, 40, 50) - Cristan
当我使用intArrayOf()函数时,我遇到了“Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage”的问题。我正在使用jdk1.8.0_241和Intellij IDEA。 - TeachMeJava

119
值得一提的是,在使用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 }

10
那个使用 lambda 初始化的第二个默认值非常有用! 谢谢。 - rf43
12
第二种初始化的方式可以写成:IntArray(N) {i -> 2},甚至(当使用常量进行初始化时)可以写成IntArray(N) {2} - David Soroko
1
我们可以使用"_"代替"i",变量arr的定义为:IntArray(N){ _ -> false}。 - Navas pk
1
那个带有lambda的代码正是我需要的,可以用动态大小和非可选默认值初始化数组。谢谢! - mithunc

82

Kotlin中有多种方法。

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 } ) is the same as var arr = IntArray(size){it} - Det

50

这里有个例子:

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

您也可以使用在线测试环境来测试语言功能。


3
一个注释,为了打印数组的值,我们可以使用array.joinToString(" ")而不是循环遍历。 - anticafe
2
代码可以运行,但看起来更像是用 Kotlin 写的 Java 代码,而不是符合 Kotlin 语言习惯的代码 :) - m0skit0

39
在Kotlin中,我们可以使用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)  

请重新格式化此答案,以便清楚哪些是代码,哪些是注释。 - user1531971
提供给任何阅读此答案的人参考...对于原始类型,使用arrayOf不如使用intArrayOf进行优化。而且,arrayOf会创建对象,而intArrayOf则保留了原始类型。 - Chris Sprague

14

老问题,但如果您想使用范围:

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

产生的结果与以下几乎相同:

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

结果:10,20,30,40,50

我认为第一个选项更易读一些。两个都可以使用。


11

Kotlin有专门的类来表示原始类型数组,避免装箱开销。例如- IntArrayShortArrayByteArray等。需要说明的是,这些类没有继承关系,但它们具有相同的方法和属性集合。每个类还有对应的工厂函数。因此,在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]

9
您可以使用这些方法。
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
如果您能提供Array<Int>()IntArray()init的示例,那将会很有帮助。目前您的回答并没有太多帮助。 - Lars Blumberg
答案已被修改。 - Ali Hasan
Array<Int> 提供了一个装箱整数的数组,而 IntArray 则提供了一个实际的整数数组。 - Mike

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
您可以像这样创建一个整数数组:

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

5是Int数组的大小。Lambda函数是元素初始化函数。'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)
  ...
 }

在Arrays.kt中定义的IntArray类


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接