跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kotlin 映射(Map)
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本文介绍 Kotlin 中的映射(Map)数据结构,适用于初学者和需要了解该概念的程序员。}} = Kotlin 映射(Map)= == 简介 == '''映射(Map)'''是 Kotlin 中一种常用的数据结构,用于存储键值对(Key-Value Pair)。它类似于字典或哈希表,允许通过键(Key)快速查找对应的值(Value)。Kotlin 中的映射分为两种: * '''不可变映射'''(使用 `mapOf` 创建) * '''可变映射'''(使用 `mutableMapOf` 创建) 映射的主要特点包括: * 键必须是唯一的,但值可以重复。 * 键和值可以是任意类型(如 `String`、`Int`、自定义类等)。 * 提供高效的查找、插入和删除操作(平均时间复杂度为 O(1))。 == 创建映射 == === 不可变映射 === 使用 `mapOf` 创建一个不可变的映射(初始化后不能修改): <syntaxhighlight lang="kotlin"> val immutableMap = mapOf( "Alice" to 25, "Bob" to 30, "Charlie" to 28 ) println(immutableMap) // 输出:{Alice=25, Bob=30, Charlie=28} </syntaxhighlight> === 可变映射 === 使用 `mutableMapOf` 创建一个可变的映射(可以动态添加或删除键值对): <syntaxhighlight lang="kotlin"> val mutableMap = mutableMapOf( "Apple" to 1.99, "Banana" to 0.99, "Orange" to 1.49 ) mutableMap["Grapes"] = 2.49 // 添加新键值对 println(mutableMap) // 输出:{Apple=1.99, Banana=0.99, Orange=1.49, Grapes=2.49} </syntaxhighlight> == 访问映射元素 == 可以通过键来访问映射中的值: <syntaxhighlight lang="kotlin"> val ageMap = mapOf("Alice" to 25, "Bob" to 30) println(ageMap["Alice"]) // 输出:25 println(ageMap.get("Bob")) // 输出:30 println(ageMap["Charlie"] ?: "Unknown") // 输出:Unknown(键不存在时返回 null,使用 Elvis 操作符提供默认值) </syntaxhighlight> == 常用操作 == === 遍历映射 === 可以使用 `for` 循环或 `forEach` 遍历映射: <syntaxhighlight lang="kotlin"> val fruits = mapOf("Apple" to "Red", "Banana" to "Yellow", "Grapes" to "Purple") // 方式 1:使用 for 循环 for ((fruit, color) in fruits) { println("$fruit is $color") } // 方式 2:使用 forEach fruits.forEach { (fruit, color) -> println("$fruit is $color") } </syntaxhighlight> 输出: <pre> Apple is Red Banana is Yellow Grapes is Purple </pre> === 检查键或值是否存在 === <syntaxhighlight lang="kotlin"> val capitals = mapOf("France" to "Paris", "Germany" to "Berlin") println("France" in capitals) // 输出:true(检查键是否存在) println("Paris" in capitals.values) // 输出:true(检查值是否存在) </syntaxhighlight> === 过滤映射 === 使用 `filter` 筛选符合条件的键值对: <syntaxhighlight lang="kotlin"> val numbers = mapOf("one" to 1, "two" to 2, "three" to 3, "four" to 4) val filtered = numbers.filter { (key, value) -> value % 2 == 0 } println(filtered) // 输出:{two=2, four=4} </syntaxhighlight> == 实际应用案例 == === 案例 1:单词频率统计 === 统计一段文本中每个单词出现的次数: <syntaxhighlight lang="kotlin"> fun countWords(text: String): Map<String, Int> { val wordCount = mutableMapOf<String, Int>() text.split(" ").forEach { word -> wordCount[word] = wordCount.getOrDefault(word, 0) + 1 } return wordCount } val text = "hello world hello kotlin world" println(countWords(text)) // 输出:{hello=2, world=2, kotlin=1} </syntaxhighlight> === 案例 2:用户缓存系统 === 使用映射实现简单的用户缓存: <syntaxhighlight lang="kotlin"> class UserCache { private val cache = mutableMapOf<Int, String>() fun getUser(id: Int): String? { return cache[id] } fun addUser(id: Int, name: String) { cache[id] = name } } val userCache = UserCache() userCache.addUser(1, "Alice") println(userCache.getUser(1)) // 输出:Alice </syntaxhighlight> == 性能分析 == Kotlin 的映射默认基于哈希表实现(`HashMap`),其操作的时间复杂度如下: * 插入:平均 O(1),最坏 O(n) * 查找:平均 O(1),最坏 O(n) * 删除:平均 O(1),最坏 O(n) <mermaid> graph LR A[插入键值对] -->|平均 O(1)| B(哈希表) C[查找键] -->|平均 O(1)| B D[删除键] -->|平均 O(1)| B </mermaid> == 进阶主题 == === 自定义对象作为键 === 如果自定义类要作为映射的键,必须正确实现 `equals()` 和 `hashCode()`: <syntaxhighlight lang="kotlin"> data class Person(val name: String, val age: Int) val personMap = mapOf( Person("Alice", 25) to "Engineer", Person("Bob", 30) to "Doctor" ) println(personMap[Person("Alice", 25)]) // 输出:Engineer </syntaxhighlight> === 排序映射 === 使用 `TreeMap` 实现按键排序的映射: <syntaxhighlight lang="kotlin"> import java.util.TreeMap val sortedMap = TreeMap(mapOf("Orange" to 3, "Apple" to 5, "Banana" to 2)) println(sortedMap) // 输出:{Apple=5, Banana=2, Orange=3}(按键字母顺序排序) </syntaxhighlight> == 总结 == * 映射是存储键值对的高效数据结构。 * Kotlin 提供不可变(`mapOf`)和可变(`mutableMapOf`)两种映射。 * 支持多种操作,如遍历、过滤、检查存在性等。 * 适用于缓存、频率统计、配置管理等场景。 {{Warning|键必须是唯一的,且自定义对象作为键时需要正确实现 `hashCode()` 和 `equals()`。}} [[Category:Kotlin 数据结构]] [[Category:编程语言]] [[Category:Kotlin]] [[Category:Kotlin数据结构]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)