如何在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
相关产品推荐
相关产品推荐

