ZetCode

Kotlin maps

最后修改于 2024 年 1 月 29 日

在本文中,我们将展示如何在 Kotlin 中使用 map。map 是一组对象对的集合。

Kotlin 区分只读 map 和可变 map。只读 map 使用 mapOf 创建,而可变 map 使用 mutableMapOf 创建。

map 是一种包含对象对的集合。每个对由一个键和一个值组成。map 键是唯一的;对于每个键,map 仅保存一个值。

Kotlin mapOf

mapOf 方法使用指定的内容创建一个只读 map,这些内容作为列表对提供,其中第一个值是键,第二个值是值。

MapOf.kt
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。

HashMap.kt
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 的大小(对的数量)。

MapSize.kt
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 具有获取所有条目、键和值的属性。

EntriesKeysValues.kt
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)
}

此示例使用 entrieskeysvalues 属性。

Entries: [coins=12, books=45, cups=33]
Keys:[coins, books, cups]
Values:[12, 45, 33]

Kotlin mutableMapOf

使用 mutableMapOf 创建一个可变 map。

MutableMap.kt
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 中检索值。

MapGet.kt
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 是否包含值。

MapContains.kt
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。

MapForEach.kt
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

我们可以使用 filterKeysfilterValuesfilter 来过滤 map。

MapFilter.kt
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 返回由应用于数组中每个元素的选择器函数产生的所有值中的最小值。

MinMax.kt
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。

SortedMap.kt
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

MapAny.kt
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 map。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 Kotlin 教程