【文字内容源于《疯狂Kotlin讲义》,代码内容原创】
Kotlin 数组和集合(二){Set集合、List集合、Map集合}_桃子不出的博客-优快云博客_kotlin sortedset
目录
1. 创建数组
[1] 使用 arrayOf()函数:这种方式无须显式指定数组的长度,但需要依次列出每个数组元素。因此,这种方式其实就相当于 Java 数组的静态初始化。使用这种方式创建数组时,由于程序己经给出了每个数组元素,因此 Kotlin 可以推断出数组元素的类型。所以,不需要在 arrayOf() 函数上使用泛型来指定数组元素的类型。
val intList = arrayOf(1, 2, 3)
for (i in intList) {
println("intList has $i")
}
运行结果:
intList has 1
intList has 2
intList has 3
[2] 使用 arrayOfNulls ()函数:这种方式需要显式指定数组的长度,数组元素全部被初始化null ,可见这种方式就是 Java 数组的动态初始化。使用这种方式创建数组时,由于Kotlin 无法推断出数组元素的类型,所以需要在 rrayOfNull ()函数上使用泛型来指定数组元素的类型。
val stringList = arrayOfNulls<String>(3)
stringList[0] = "hello"
stringList[1] = "你好"
stringList[2] = "萨瓦迪卡"
for (s in stringList) {
println("stringList has $s")
}
运行结果:
stringList has hello
stringList has 你好
stringList has 萨瓦迪卡
[3] 使用 emptyArray()函数: 这种方式会创建一个长度为0的空数组。由于没有指定数组元素,因此需要使用泛型来指定数组元素的类型。
val emptyList = arrayOfNulls<Int>(4)
for (e in emptyList){
println("emptyList has $e")
}
运行结果:
emptyList has null
emptyList has null
emptyList has null
emptyList has null
[4] 使用 Array(size: 川, init: (Int) -> )构造器: 这种方式需要显式指定数组的长度,并可通过 Lambda 表达式来动态计算各数组元素的值。这种方式是原来 Java 所不具备的。
val arr1 = Array(3) { "test" }
for (a1 in arr1) {
println("arr1 has $a1")
}
运行结果:
arr1 has test
arr1 has test
arr1 has test
//Lambda表达式中的it用于代表该表达式的唯一形参
val arr2 = Array(3) { (it + 2) * 4 }
for (a2 in arr2) {
println("arr2 has $a2")
}
运行结果:
arr2 has 8
arr2 has 12
arr2 has 16
2. 使用数组
数组的常用方法就是访问数组元素,包括对数组元素进行赋值和取出数组元素的值。访问数组元素都是通过在数组引用变量后紧跟 个方括号( [] )实现的,方括号里是数组元素的索引。正如前面所介绍的, Kotlin 的方括号运算符其实是 get(index)和 set(index, value)方法,因此当程序使用[i]获取数组元素的值时,实际上就是调用 get( index )方法;当使用 [index]对数组元素赋值时,实际上就是调用 set(index , value)方法。
val intArray = intArrayOf(11, 22, 33, 44)
//获取第一个元素的值
println("intArray[0] = ${intArray[0]}")
//对第三个元素的值重新赋值
println("intArray[0] before is ${intArray[2]}")
intArray[2] = 333
println("intArray[0] after is ${intArray[2]}")
运行结果:
intArray[0] = 11
intArray[0] before is 33
intArray[0] after is 333
3. 使用 for-in 循环遍历数组
Kotlin for-in 循环可自动遍历数组的每个元素。
val forInArray = arrayOf("今天过得好吗?", "今天过得好。", "那真是太好了。")
for (f in forInArray) {
println(f)
}
运行结果:
今天过得好吗?
今天过得好。
那真是太好了。
4. 使用数组索引
[1] 使用索引遍历数组时使用until arra size 这种方式来创建区间。
[2] Kotlin 的数组提供了indices 属性,该属性即可返回数组的索引区间。(更便捷)
val indicesArray = arrayOf(1, 3, 5, 7, 9)
for (index1 in 0 until indicesArray.size) {
println("[1]until test : ${indicesArray[index1]}")
}
for (index2 in indicesArray.indices) {
println("[2]indices test : ${indicesArray[index2]}")
}
运行结果:
[1]until test : 1
[1]until test : 3
[1]until test : 5
[1]until test : 7
[1]until test : 9
[2]indices test : 1
[2]indices test : 3
[2]indices test : 5
[2]indices test : 7
[2]indices test : 9
5. 多维数组
所谓的多维数组其实都是 维数组,只要让数组的元素又是数组,那么该数组就变成了多维数组。
val multiArray = arrayOfNulls<Array<String>>(4)
//初始化数组元素
multiArray[0] = arrayOf("现在是春天吗?", "是的,现在是春天。")
multiArray[1] = arrayOf("现在是夏天吗?", "是的,现在是夏天。")
multiArray[2] = arrayOf("现在是秋天吗?", "是的,现在是秋天。")
multiArray[3] = arrayOf("现在是冬天吗?", "是的,现在是冬天。")
for (firstIndex in multiArray.indices) {
val detailString = StringBuilder("")
for (secondIndex in multiArray[firstIndex]!!.indices) {
detailString.append(multiArray[firstIndex]!![secondIndex])
if (secondIndex != multiArray[firstIndex]!!.lastIndex) {
detailString.append(" | ")
}
}
println("$firstIndex | $detailString")
}
运行结果:
0 | 现在是春天吗? | 是的,现在是春天。
1 | 现在是夏天吗? | 是的,现在是夏天。
2 | 现在是秋天吗? | 是的,现在是秋天。
3 | 现在是冬天吗? | 是的,现在是冬天。
