如何将嵌套Kotlin Map转换为带点分隔键的字符串数组
实现方法
可以通过递归遍历嵌套Map的方式来实现,核心逻辑是跟踪当前键的路径,遇到嵌套Map时拼接路径前缀,遇到普通值时生成指定格式的字符串。
具体代码实现
fun flattenMap(map: Map<String, Any>, prefix: String = ""): List<String> { val result = mutableListOf<String>() for ((key, value) in map) { val currentKey = if (prefix.isEmpty()) key else "$prefix.$key" when (value) { is Map<*, *> -> { @Suppress("UNCHECKED_CAST") result.addAll(flattenMap(value as Map<String, Any>, currentKey)) } else -> result.add("$currentKey=$value") } } return result } // 测试示例 fun main() { val map = mapOf( "A" to "1", "B" to mapOf( "C" to "2" ) ) val flattened = flattenMap(map) println(flattened) // 输出: [A=1, B.C=2] }
代码说明
- 递归函数
flattenMap接收两个参数:待遍历的Map和当前的键路径前缀(默认空字符串)。 - 遍历Map的每个键值对:
- 拼接当前键的完整路径:如果前缀为空,直接用当前key;否则用
前缀.key的格式。 - 如果值是嵌套的Map,就递归调用函数,传入该子Map和新的路径前缀,将返回的结果加入列表。
- 如果值是普通类型(比如String),直接生成
路径=值格式的字符串加入结果列表。
- 拼接当前键的完整路径:如果前缀为空,直接用当前key;否则用
- 最终返回整理好的字符串列表。
扩展说明
如果嵌套Map的层级更多(比如"B" to mapOf("C" to mapOf("D" to "3"))),这个方法也能正确处理,会生成"B.C.D=3"这样的字符串。
内容的提问来源于stack exchange,提问作者Nikita Chegodaev
相关产品推荐
相关产品推荐

