7:kotlin 数组 (Arrays)

数组是一种数据结构,它保存固定数量的相同类型或其子类型的值。kotlin中最常见的数组类型是对象类型数组,数组由array类表示。

什么时候使用

当你在kotlin中有特殊的底层需求需要满足时,可以使用数组。例如,如果你有超出常规应用所需的性能要求,或者你需要构建自定义的数据结构。如果你没有这些限制,那么可以使用集合(Collections)。

与数组相比,集合有以下优点:

  • 集合可以是只读的,这给你提供了更多的控制权,使你能够编写具有明确意图的健壮代码。

  • 从集合中添加或删除元素很容易。相比之下,数组的大小是固定的。从数组中添加或删除元素的唯一方法是每次都创建一个新的数组,这非常低效

    kotlin 复制代码
    fun main() {
        val riversArray1 = arrayOf("Nile", "Amazon", "Yangtze")
    
        val riversArray2 = riversArray1 + "Mississippi"
        println(riversArray1.joinToString())    // Nile, Amazon, Yangtze
        println(riversArray2.joinToString())    // Nile, Amazon, Yangtze, Mississippi
    }
  • 可以使用==来比较两个集合是否相同,但是不能使用该操作来比较数组

创建数组

  • arrayOf()arrayOfNulls() emptyArray()

    kotlin 复制代码
    fun main() {
        val simpleArray = arrayOf(1, 2, 3)
        println(simpleArray.joinToString()) // 1, 2, 3
    
        val nullArray: Array<Int?> = arrayOfNulls(3)
        println(nullArray.joinToString())   // null, null, null
    
        val exampleArray1 = emptyArray<String>()
        val exampleArray2: Array<String> = emptyArray()
        println(exampleArray1.joinToString())   //  空
        println(exampleArray2.joinToString())   // 空
    }
  • Array 的构造方法 Array构造函数接受数组大小和一个函数,该函数根据数组的索引返回数组元素的值

    kotlin 复制代码
    fun main() {
        val initArray = Array<Int>(3) { 0 }
        println(initArray.joinToString()) // 0, 0, 0
        
        val asc = Array(5) { i -> (i * i).toString() }
       println(asc.joinToString())   // 014916
    }

嵌套数组

kotlin 复制代码
fun main() {
    // 两层嵌套
    val twoDArray = Array(2) { Array<Int>(2) { 0 } }
    println(twoDArray.contentDeepToString()) // [[0, 0], [0, 0]]
    
    // 三层嵌套
    val threeDArray = Array(3) { Array(3) { Array<Int>(3) { 0 } } }
    println(threeDArray.contentDeepToString())  // [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
}

嵌套数组可以是不通长度不同类型

获取/修改

数组中的元素是可变的,如果想要获取和修改数组中的元素需要使用[索引]来操作

kotlin 复制代码
fun main() {
    val simpleArray = arrayOf(1, 2, 3)
    val twoDArray = Array(2) { Array<Int>(2) { 0 } }

    // 修改元素
    simpleArray[0] = 10
    twoDArray[0][0] = 2

    println(simpleArray[0].toString()) // 10
    println(twoDArray[0][0].toString()) // 2
}

使用数组

kotlin中,数组可以作为方法的可变数量参数使用,也可以对数组本身做操作,如比较数组、转换数组内容,转成集合等

可变数量参数

可变数量参数使用vararg 声明,传递参数前使用*

kotlin 复制代码
fun main() {
    val lettersArray = arrayOf("c", "d")
    printAllStrings("a", "b", *lettersArray)
    // abcd
}

fun printAllStrings(vararg strings: String) {
    for (string in strings) {
        print(string)	
    }
}

比较

对比数据需要使用.contentEquals()或者.contentDeepEquals()方法

kotlin 复制代码
fun main() {
    val simpleArray = arrayOf(1, 2, 3)
    val anotherArray = arrayOf(1, 2, 3)

    println(simpleArray.contentEquals(anotherArray))    // true
    
    // 修改元素
    simpleArray[0] = 10 
    println(simpleArray contentEquals anotherArray) // false
}

常用方法

求和

kotlin 复制代码
fun main() {
    val sumArray = arrayOf(1, 2, 3)

    println(sumArray.sum()) // 6
}

洗牌(打乱顺序)

随机打乱顺序

kotlin 复制代码
fun main() {
    val simpleArray = arrayOf(1, 2, 3)

    simpleArray.shuffle()
    println(simpleArray.joinToString()) // 1, 3, 2

    simpleArray.shuffle()
    println(simpleArray.joinToString()) // 2, 1, 3
}

转成集合

转成List或者Set使用.toList()或者.toSet()方法

kotlin 复制代码
fun main() {
    val simpleArray = arrayOf("a", "b", "c", "c")
    
    println(simpleArray.toSet()) // [a, b, c]
    println(simpleArray.toList())// [a, b, c, c]
}

转成Map使用.toMap方法

只有键值对数组才能转成Map

kotlin 复制代码
fun main() {
    val pairArray = arrayOf("apple" to 120, "banana" to 150, "cherry" to 90, "apple" to 140)
    
    println(pairArray.toMap()) // {apple=140, banana=150, cherry=90}
}

基本类型数组

如果使用上文中的数组,数据类型会被包装成Object类型,如果需要存储基本数据类型的元素,可以使用基本数据类型数组,避免开装箱造成的性能损失

基本类型数组有

  • BooleanArray
  • ByteArray
  • CharArray
  • DoubleArray
  • FloatArray
  • IntArray
  • LongArray
  • ShortArray

虽然这写类和Array没有继承关系,但是具有相同的方法

Object类型数组和基本类型数组可以互转

kotlin 复制代码
fun main() {
    val intObjArray = arrayOf(1, 2, 3, 4)
    intObjArray.toIntArray()    // 转成Int数组

    val intArray = intArrayOf(1, 2, 3, 4)
    intArray.toTypedArray() // 转成Object数组

    val booleanArray = booleanArrayOf(false, true)
    booleanArray.toTypedArray()

    val booleanObjArray = arrayOf(false, true)
    booleanObjArray.toBooleanArray()
}
相关推荐
捕鲸叉23 分钟前
C++设计模式和编程框架两种设计元素的比较与相互关系
开发语言·c++·设计模式
未知陨落1 小时前
数据结构——二叉搜索树
开发语言·数据结构·c++·二叉搜索树
大波V51 小时前
设计模式-参考的雷丰阳老师直播课
java·开发语言·设计模式
无敌最俊朗@1 小时前
unity3d————接口基础知识点
开发语言·c#
一丝晨光2 小时前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++
南城花随雪。2 小时前
Spring框架之装饰者模式 (Decorator Pattern)
java·开发语言·装饰器模式
究极无敌暴龙战神X2 小时前
前端学习之ES6+
开发语言·javascript·ecmascript
虞书欣的62 小时前
Python小游戏24——小恐龙躲避游戏
开发语言·python·游戏·小程序·pygame
FHYAAAX2 小时前
【机器学习】任务十:从函数分析到机器学习应用与BP神经网络
开发语言·python
汉克老师3 小时前
GESP4级考试语法知识(贪心算法(四))
开发语言·c++·算法·贪心算法·图论·1024程序员节