You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin中用嵌套HashMap实现Trie结构?

用嵌套MutableMap实现符合Kotlin惯用写法的Trie结构

你遇到的编译错误核心原因是Kotlin静态类型系统与Python动态类型的差异:你定义的trie类型是MutableMap<Char, MutableMap<Char, Any>>,但cur[letter]返回的是MutableMap<Char, Any>?,无法直接赋值给类型为MutableMap<Char, MutableMap<Char, Any>>的cur变量。

要实现和Python完全一致的嵌套字典式Trie,可以利用Kotlin的递归类型别名简化类型定义,同时使用getOrPut函数替代手动判断键是否存在,这更符合Kotlin的惯用写法:

// 定义递归类型别名,每个Trie节点都是嵌套的MutableMap
typealias TrieNode = MutableMap<Char, TrieNode>

fun buildTrie(words: List<String>): TrieNode {
    val trie = mutableMapOf<Char, TrieNode>()
    for (word in words) {
        var currentNode = trie
        for (char in word) {
            // 若字符不存在则创建新节点,直接返回对应节点
            currentNode = currentNode.getOrPut(char) { mutableMapOf() }
        }
        // 标记单词结束的终端节点
        currentNode['#'] = mutableMapOf()
    }
    return trie
}

代码说明:

  • typealias TrieNode = MutableMap<Char, TrieNode>:递归类型别名完美对应Python中嵌套字典的结构,每个节点既是MutableMap,其值也是相同类型的节点。
  • getOrPut函数:Kotlin标准库函数,替代了Python中“判断键是否存在→不存在则创建”的逻辑,代码更简洁。
  • 类型安全:全程无需强制类型转换,递归类型别名让编译器能正确推导类型,避免了原代码的类型不匹配问题。

测试输入listOf("test","this","trie"),生成的Trie结构和Python版本完全一致,只是在Kotlin中以MutableMap的形式存在。

如果你不想用类型别名,也可以直接使用MutableMap<Char, MutableMap<*, *>>,但这样会丢失部分类型信息,不如递归类型别名清晰:

fun buildTrieWithoutAlias(words: List<String>): MutableMap<Char, MutableMap<*, *>> {
    val trie = mutableMapOf<Char, MutableMap<*, *>>()
    for (word in words) {
        var cur = trie
        for (letter in word) {
            cur.putIfAbsent(letter, mutableMapOf())
            cur = cur[letter] as MutableMap<Char, MutableMap<*, *>>
        }
        cur['#'] = mutableMapOf()
    }
    return trie
}

这种写法需要手动做类型转换(因为cur[letter]返回的是MutableMap<*, *>?),但也能实现相同功能。

内容的提问来源于stack exchange,提问作者jce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:35:28