Kotlin maps
最后修改于 2024 年 1 月 29 日
在本文中,我们将展示如何在 Kotlin 中使用 map。map 是一组对象对的集合。
Kotlin 区分只读 map 和可变 map。只读 map 使用 mapOf
创建,而可变 map 使用 mutableMapOf
创建。
map 是一种包含对象对的集合。每个对由一个键和一个值组成。map 键是唯一的;对于每个键,map 仅保存一个值。
Kotlin mapOf
mapOf
方法使用指定的内容创建一个只读 map,这些内容作为列表对提供,其中第一个值是键,第二个值是值。
package com.zetcode fun main() { val chars = mapOf(97 to "a", 98 to "b", 120 to "x") println(chars) val user = mapOf("name" to "Luke", "age" to "23") println(user) }
此示例创建了两个 map。
{97=a, 98=b, 120=x} {name=Luke, age=23}
Kotlin HashMap
可以从 Java 的 HashMap
创建一个 map。
package com.zetcode fun main() { val items = HashMap<String, Int>() items["A"] = 90 items["B"] = 80 items["C"] = 70 for ((k, v) in items) { println("$k = $v") } }
此示例使用 Java 的 HashMap
创建一个 map,并将值和对打印到控制台。
Kotlin map 大小
可以使用 size
属性和 count
方法来确定 map 的大小(对的数量)。
package com.zetcode fun main() { val items = mapOf("coins" to 12, "books" to 45, "cups" to 33, "pens" to 2) println("Map has ${items.size} items") println("Map has ${items.count()} items") val n = items.count { it.value > 10 } println("# of values greater that 10: $n") }
此示例计算 map 对的数量。
val n = items.count { it.value > 10 }
使用 count
方法,我们计算大于 10 的值的数量。
Map has 4 items Map has 4 items # of values greater that 10: 3
Kotlin entries, keys, values
Kotlin map 具有获取所有条目、键和值的属性。
package com.zetcode fun main() { val items = mapOf("coins" to 12, "books" to 45, "cups" to 33) println("Entries: " + items.entries) println("Keys:" + items.keys) println("Values:" + items.values) }
此示例使用 entries
、keys
和 values
属性。
Entries: [coins=12, books=45, cups=33] Keys:[coins, books, cups] Values:[12, 45, 33]
Kotlin mutableMapOf
使用 mutableMapOf
创建一个可变 map。
package com.zetcode fun main() { val user = mutableMapOf("name" to "John Doe", "occupation" to "programmer") println(user) // user.put("location", "USA") user["location"] = "USA" println(user) user.remove("occupation") println(user) user.clear() println(user) if (user.isEmpty()) { println("empty") } else { println("not empty") } }
此示例创建了一个可变 map,并展示了它的方法。
// user.put("location", "USA") user["location"] = "USA" println(user)
将一个新的对添加到 map 中。IntelliJ IDEA 建议使用赋值操作。
user.remove("occupation")
使用 remove
删除一个对。
user.clear()
使用 clear
删除所有对。
if (user.isEmpty()) { println("empty") } else { println("not empty") }
isEmpty
方法检查 map 是否为空。
{name=John Doe, occupation=programmer} {name=John Doe, occupation=programmer, location=USA} {name=John Doe, location=USA} {} empty
Kotlin 获取值
有几种方法可以从 Kotlin map 中检索值。
package com.zetcode fun main() { val items = mapOf("coins" to 12, "books" to 45, "cups" to 33, "pens" to 2) // println(items.get("coins")) println(items["coins"]) println(items.getValue("coins")) println(items.getOrDefault("pens", 0)) println(items.getOrDefault("pencils", 0)) val nOfPencils = items.getOrElse("pencils", { 0 }) println(nOfPencils) }
此示例从 map 中获取值。
// println(items.get("coins")) println(items["coins"])
IntelliJ IDEA 建议使用索引操作而不是 get
。
println(items.getOrDefault("pens", 0))
如果键不存在,getOrDefault
返回对应于该键的值或指定的默认值。
val nOfPencils = items.getOrElse("pencils", { 0 })
如果给定键没有条目,getOrElse
返回给定键的值,或者指定函数的计算结果。
Kotlin 包含键/值
containsKey
检查 map 是否包含键。containsValue
检查 map 是否包含值。
package com.zetcode fun main() { val items = mapOf("coins" to 12, "books" to 45, "cups" to 33, "pens" to 2) if (items.containsKey("cups")) { println("contains cups") } else { println("does not contain cups") } val value = 25 if (items.containsValue(value)) { println("contains value $value") } else { println("does not contain value $value") } }
此示例检查 map 是否包含键 "cups" 和值 25。
Kotlin map forEach
使用 forEach
,我们可以遍历 map。
package com.zetcode fun main() { val items = mapOf("coins" to 12, "books" to 45, "cups" to 33, "pens" to 2) items.forEach { (k, v) -> println("There are $v $k") } }
此示例使用 forEach
遍历 map。
There are 12 coins There are 45 books There are 33 cups There are 2 pens
Kotlin 过滤 map
我们可以使用 filterKeys
、filterValues
和 filter
来过滤 map。
package com.zetcode fun main() { val items = mapOf("A" to 90, "B" to 80, "C" to 70, "D" to 60, "E" to 50) val filtered = items.filterKeys { it == "A" || it == "C" } println(filtered) val filtered2 = items.filterValues { it >= 70 } println(filtered2) val filtered3 = items.filter { it.key == "A" || it.value == 50 } println(filtered3) }
此示例过滤 map。
val filtered = items.filterKeys { it == "A" || it == "C" }
我们过滤掉所有与指定键匹配的对。
val filtered2 = items.filterValues { it >= 70 }
我们过滤掉所有与指定值匹配的对。
val filtered3 = items.filter { it.key == "A" || it.value == 50 }
在这里,我们过滤掉所有与给定键或值匹配的对。
{A=90, C=70} {A=90, B=80, C=70} {A=90, E=50}
Kotlin map maxOf & minOf
maxOf
返回由应用于数组中每个元素的选择器函数产生的所有值中的最大值。minOf
返回由应用于数组中每个元素的选择器函数产生的所有值中的最小值。
package com.zetcode data class User(val fname: String, val lname: String, val salary: Int) fun main() { val users = mapOf( 1 to User("John", "Doe", 1230), 2 to User("Lucy", "Novak", 670), 3 to User("Ben", "Walter", 2050), 4 to User("Robin", "Brown", 2300), 5 to User("Amy", "Doe", 1250), 6 to User("Joe", "Draker", 1190), 7 to User("Janet", "Doe", 980), 8 to User("Albert", "Novak", 1930) ) val maxSalary = users.maxOf { it.value.salary } println(maxSalary) val minSalary = users.minOf { it.value.salary } println(minSalary) }
在此示例中,我们找出最小和最大的工资。
Kotlin 排序的 map
使用 sortedMapOf
创建一个排序的 map。
package com.zetcode fun main() { val items = mapOf("coins" to 12, "books" to 45, "cups" to 33, "pens" to 2) println(items) val sortedItems = sortedMapOf("coins" to 12, "books" to 45, "cups" to 33, "pens" to 2) println(sortedItems) }
此示例打印一个未排序和排序的 map。
{coins=12, books=45, cups=33, pens=2} {books=45, coins=12, cups=33, pens=2}
这些对按键排序。
Kotlin map any
如果至少有一个条目与给定的谓词匹配,any
方法返回 true
。
package com.zetcode fun main() { val items = mapOf("coins" to 12, "books" to 45, "cups" to 33, "pens" to 2) val value = 12 val hasValue = items.any { it.value == value } if (hasValue) { println("The map has value $value") } else { println("The map does not have value $value") } val isEven: (Int) -> Boolean = { it % 2 == 0 } val hasEvenValue = items.any { isEven(it.value) } if (hasEvenValue) { println("The map has even value(s)") } else { println("The map does not have even value(s)") } }
在此示例中,我们检查 map 是否包含至少一个值 12 以及是否至少有一个偶数值。
The map has value 12 The map has even value(s)
来源
在本文中,我们介绍了 Kotlin map。
作者
列出 所有 Kotlin 教程。