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

How to initialize an array in Kotlin with values?

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

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

Kotlin的数组初始化看起来如何?


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

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


值得一提的是,当使用Kotlin内置项(例如,intArrayOf()longArrayOf()arrayOf()等)时,您无法使用给定大小的默认值(或所有值都为所需值)初始化数组,而是需要根据类构造函数调用来初始化。

1
2
3
4
5
// 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 }


下面是一个例子:

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

您还可以使用操场测试语言功能。


科特林有几种方法。

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

然后简单地从用户、其他集合或任何您想要的地方获取初始值。

1
2
var arr = IntArray(size, { 0 } ) // construct with size and fill array with 0
var arr = IntArray(size, { it * 1 } ) // construct with size and fill with its index

我们还可以创建内置函数的数组,比如-

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

另一种方式

1
2
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。


在Kotlin中,我们可以使用arrayOf()intArrayOf()charArrayOf()booleanArrayOf()longArrayOf()函数创建数组。

例如:

1
2
3
4
5
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)


旧问题,但如果要使用范围:

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

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

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

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

我认为第一个选项的可读性要高一些。两者都有效。


你可以用这种方法

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

例子

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

init表示默认值(初始化)


我认为值得一提的是,文档中不够直观的一点是,当您使用工厂函数创建数组并指定其大小时,数组初始化时使用的值等于其索引值。例如,在这样的数组中: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数组:

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

5是int数组大小。lambda函数是element init函数。它的范围在[0,4]内,加上1使范围在[1,5]内。

原点函数为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 /**
 * 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)
  ...
 }

在array.kt中定义的intarray类


您可以尝试以下操作:

1
var a = Array<Int>(5){0}


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

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

但是,使用特殊的构造函数可能是有意义的:

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

传递一个描述如何初始化值的大小和lambda。文件如下:

1
2
3
4
5
/**
 * 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)


Kotlin语言有专门的类来表示基本类型的数组,而不需要额外的装箱开销:例如,IntArrayShortArrayByteArray等。我需要说,这些类与父Array类没有继承关系,但它们具有相同的方法和属性集。它们中的每一个都有相应的工厂功能。因此,要用Kotlin中的值初始化数组,只需键入以下内容:

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

…或者这样:

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

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

现在您可以使用它:

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

希望这有帮助。


我想知道为什么没有人给出最简单的答案:

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

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

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

例如,使用args4j库中的@option查看此代码:

1
2
3
4
5
6
    @Option(
        name ="-h",
        aliases = ["--help","-?"],
        usage ="Show this help"
    )
    var help: Boolean = false

选项参数"aliases"的类型为Array


在全局声明int数组

1
var numbers= intArrayOf()

下一个onCreate方法使用值初始化数组

1
2
3
4
5
6
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)
}


在我的情况下,我需要初始化我的抽屉项目。我用下面的代码填充数据。

1
2
3
4
5
6
7
8
    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)

自定义模型类-

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

}


这样初始化数组:val paramValueList : Array = arrayOfNulls(5)