1. 简介

数组结构 是我们日常开发中非常基础且常用的数据结构。除了用于存储各种类型的数据外,我们有时还需要对数组进行修改,例如在特定位置插入新元素。

本文将介绍几种在 Kotlin 中向数组指定位置插入元素的方法,适用于不同场景下的需求。


2. 使用循环和新数组

一种最直接的方法是创建一个比原数组大 1 的新数组,通过循环将原数组的元素逐个复制过去,并在指定位置插入新元素。

示例代码如下:

@Test
fun `insert array element at specific position using a loop and new array`(){
    val array = arrayOf("one", "three", "four", "five")

    val position = 1
    val element = "two"
    val newArray = Array(array.size + 1) { "" }
    
    for (i in 0 until newArray.size) {
        newArray[i] = array[if(i < position) i else i - 1]
    }
    newArray[position] = element
    
    assertArrayEquals(arrayOf("one", "two", "three", "four", "five"), newArray)
}

优点:逻辑清晰,适合理解底层实现
缺点:代码量较多,效率略低
⚠️ 注意:position 越界需要自行判断


3. 使用 System.arraycopy()

该方法是对上一种方法的优化,使用 Java 提供的 System.arraycopy() 方法进行高效复制:

@Test
fun `insert array element at specific position using system arraycopy() and new array`(){
    val array = arrayOf("one", "three", "four", "five")
    val position = 1
    val element = "two"
    val newArray = Array(array.size + 1) { "" }

    System.arraycopy(array, 0, newArray, 0, position)
    newArray[position] = element
    System.arraycopy(array, position, newArray, position + 1, array.size - position)

    assertArrayEquals(arrayOf("one", "two", "three", "four", "five"), newArray)
}

优点:性能较好,适合处理较大数组
缺点:代码略显繁琐
⚠️ 建议:熟悉 Java 的开发者更适合使用此方法


4. 使用 copyOfRange() 方法

Kotlin 中的 copyOfRange() 方法允许我们复制数组中指定范围的元素,非常适合用来实现插入操作:

@Test
fun `insert array element at specific position using copyOfRange() method`(){
    val array = arrayOf("one", "three", "four", "five")
    val position = 1
    val element = "two"
    val newArray = array.copyOfRange(0, position) + element + array.copyOfRange(position, array.size)
    assertArrayEquals(arrayOf("one", "two", "three", "four", "five"), newArray)
}

优点:代码简洁,语义清晰
缺点:涉及多次数组拼接,性能略差
⚠️ 注意+ 操作符在 Kotlin 中用于数组拼接时会生成新数组


5. 使用 sliceArray() 方法和加号操作符

sliceArray() 是 Kotlin 提供的一个数组切片函数,可以结合 + 操作符实现插入功能:

fun insertArrayElementUsingSliceMethodAndPlusOperator(array: Array<String>, position: Int, element: String): Array<String> {
    return array.sliceArray(0 until position) +
      element + array.sliceArray(position until array.size)
}

测试代码如下:

@Test
fun `insert array element at specific position using slice() and plus operator`() {
    val array = arrayOf("one", "three", "four", "five")
    val position = 1
    val element = "two"
    val newArray = insertArrayElementUsingSliceMethodAndPlusOperator(array, position, element)

    assertArrayEquals(arrayOf("one", "two", "three", "four", "five"), newArray)
}

优点:语法简洁,可读性强
缺点:性能与 copyOfRange 类似,不适合大规模数组
⚠️ 建议:适合代码风格偏函数式、注重可读性的项目


6. 使用 MutableList 接口

Kotlin 提供了 MutableList 接口,支持在任意位置插入元素,使用非常方便:

fun insertArrayElementUsingMutableList(array: Array<String>, position: Int, element: String): Array<String> {
    val mutableList = array.toMutableList()
    mutableList.add(position, element)
    return mutableList.toTypedArray()
}

测试代码如下:

@Test
fun `insert array element at specific position using mutabelist method`() {
    val array = arrayOf("one", "three", "four", "five")
    val position = 1
    val element = "two"
    val newArray = insertArrayElementUsingMutableList(array, position, element)

    assertArrayEquals(arrayOf("one", "two", "three", "four", "five"), newArray)
}

优点:代码简洁,逻辑清晰
缺点:涉及类型转换,可能带来轻微性能损耗
⚠️ 建议:适合小型数组或对性能不敏感的场景


7. 总结

本文介绍了多种在 Kotlin 中向数组指定位置插入元素的方法,包括:

  • 使用循环和新数组
  • 使用 System.arraycopy
  • 使用 copyOfRange
  • 使用 sliceArray+ 操作符
  • 使用 MutableList 接口

每种方法都有其适用场景,开发者可根据实际需求选择最合适的实现方式。

完整示例代码请参考 GitHub 项目地址


原始标题:Insert an Element at a Given Position Into an Array in Kotlin