1. 简介

在 Kotlin 中,Map 是一种键值对集合,其中每个键必须是唯一的。我们可以通过键来访问对应的值,就像使用索引一样。

在实际开发中,我们可能会遇到一种场景:需要使用两个数组来创建一个 Map。也就是说,一个数组的元素作为键,另一个数组的元素作为对应的值。

本文将介绍几种在 Kotlin 中实现这种需求的常见方式。

2. 前提条件

在开始之前,我们需要明确一些前提条件,这些将影响我们最终选择的实现方式:

✅ 两个数组的长度应该一致
✅ 第一个数组中的元素作为 Map 的 key,第二个数组作为 value
✅ key 数组中的元素应尽量唯一,如果出现重复 key,后面的值会覆盖前面的值(具体行为取决于实现方式)

3. 使用 for() 循环

这是最基础也是最直观的方式。我们可以写一个辅助函数,接收两个数组参数,并返回一个 Map

fun createMap(keys: Array<String>, values: Array<Int>): Map<String, Int> {
    val map = mutableMapOf<String, Int>()
    for (i in keys.indices) {
        map[keys[i]] = values[i]
    }
    return map
}

优点:逻辑清晰,控制力强
缺点:代码略显冗长,不够函数式

✅ 单元测试示例

@Test
fun `creates a map from two arrays using a custom approach`() {
    val keys = arrayOf("a", "b", "c")
    val values = arrayOf(1, 2, 3)

    val map = createMap(keys, values)
    val expected = mapOf("a" to 1, "b" to 2, "c" to 3)

    assertEquals(3, map.size)
    assertEquals(expected, map)
}

4. 使用 zip() 方法

Kotlin 标准库提供了 zip() 方法,可以将两个数组“拉链”式组合成一个 List<Pair>,然后通过 toMap() 转换为 Map。

@Test
fun `creates a map from two arrays using zip() method`() {
    val keys = arrayOf("a", "b", "c")
    val values = arrayOf(1, 2, 3)

    val map = keys.zip(values).toMap()
    val expected = mapOf("a" to 1, "b" to 2, "c" to 3)

    assertEquals(3, map.size)
    assertEquals(expected, map)
}

优点:代码简洁、语义清晰
⚠️ 注意:如果 key 数组中存在重复项,后面的值会覆盖前面的值

5. 使用 associateWith() 方法

associateWith() 方法可以将一个数组的元素作为 key,然后通过 lambda 表达式为每个 key 生成对应的 value。

@Test
fun `creates a map from two arrays using the associateWith() method`() {
    val keys = arrayOf("a", "b", "c")
    val values = arrayOf(1, 2, 3)

    val map = keys.associateWith { key -> values[keys.indexOf(key)] }
    val expected = mapOf("a" to 1, "b" to 2, "c" to 3)

    assertEquals(3, map.size)
    assertEquals(expected, map)
}

⚠️ 踩坑提醒:这个方法处理重复 key 的方式不同 —— 它会保留第一个出现的 key,因为 indexOf() 总是返回第一个匹配项的索引。

优点:适用于需要动态生成 value 的场景
缺点:效率略低(因为每次都要调用 indexOf()

6. 使用 mapIndexed() 方法

mapIndexed() 方法可以让我们在遍历数组的同时访问索引,非常适合用来组合两个数组的元素为键值对。

@Test
fun `creates a map from two arrays using the mapIndexed() method`() {
    val keys = arrayOf("a", "b", "c")
    val values = arrayOf(1, 2, 3)

    val pairs = keys.mapIndexed { index, key -> key to values[index] }
    val map = pairs.toMap()
    val expected = mapOf("a" to 1, "b" to 2, "c" to 3)

    assertEquals(3, map.size)
    assertEquals(expected, map)
}

优点:函数式风格,代码优雅
灵活性高:可以灵活处理键值对映射逻辑

7. 总结

在 Kotlin 中,使用两个数组创建 Map 有多种方式,每种方式都有其适用场景:

方法 特点 适用场景
for() 循环 最基础,最灵活 需要完全控制逻辑时
zip() 简洁直观 数组长度一致,无需复杂逻辑
associateWith() 可动态生成 value key 需要动态映射 value
mapIndexed() 函数式风格 偏好函数式编程风格

📌 建议

  • 如果你追求简洁,优先使用 zip()mapIndexed()
  • 如果你有特殊逻辑(如动态生成 value),考虑 associateWith()
  • 如果你对性能敏感或需要精确控制流程,可以使用 for() 循环

根据你的项目需求选择最合适的方式即可。


原始标题:Creating a Map from Two Arrays in Kotlin