Kotlin高效嵌套数据查找结构实现:PDF与JSON映射查询问询
方案可行性分析与实现
方案可行性判断
你提出的三级嵌套Map方案完全可行,而且非常贴合你的查询需求:
- 三级Key(学生ID → 文档imageCode → 所有者类型)正好匹配你需要的查询维度
- 基于Map的查询操作时间复杂度为O(1),查询效率极高
- 结构清晰,能直观反映数据之间的关联关系
如果你的查询场景固定为「通过学生ID、imageCode、所有者类型查询documentYear」,这个方案是当前场景下的最优选择之一。
Kotlin实现代码
利用Kotlin标准库的集合操作,可以简洁完成嵌套Map的构建:
// 从List<Idoc>构建目标嵌套Map fun buildDocumentLookup(idocs: List<Idoc>): Map<String, Map<String, Map<String, Document>>> { return idocs // 展开所有Idoc中的Student .flatMap { it.students } // 展开每个Student的Document,同时关联StudentId和所有者类型 .flatMap { student -> student.documents.map { document -> Triple(student.id, document, document.owners.firstOrNull()?.type) } } // 过滤无所有者类型的无效Document(按需调整) .filter { it.third != null } // 第一层按StudentId分组 .groupBy(keySelector = { it.first }, valueTransform = { Pair(it.second.imageCode, Pair(it.second, it.third!!)) }) // 转换为二级Map(imageCode → 所有者类型 → Document) .mapValues { (_, studentDocs) -> studentDocs .groupBy(keySelector = { it.first }, valueTransform = { it.second }) .mapValues { (_, imageEntries) -> imageEntries.associateBy(keySelector = { it.second }, valueTransform = { it.first }) } } } // 使用示例 val idocs: List<Idoc> = // 你的JSON反序列化结果 val lookupMap = buildDocumentLookup(idocs) // 查询documentYear val targetYear = lookupMap["学生ID"]?.get("文档imageCode")?.get("所有者类型")?.documentYear
代码说明
- 数据展开:通过
flatMap逐层拆解Idoc→Student→Document,同时绑定所需的查询Key - 无效数据过滤:提前过滤掉无所有者类型的Document,避免后续查询出现空指针
- 嵌套结构构建:
- 第一层按学生ID分组
- 第二层按文档imageCode分组
- 第三层通过
associateBy将所有者类型直接映射到对应的Document
- 快速查询:通过三级Key链式访问,一步获取目标
documentYear
可选优化方向
如果后续需要更灵活的查询(比如按学生ID+imageCode获取所有所有者的文档),可以将三级Map调整为Map<String, Map<String, List<Pair<String, Document>>>>,但如果查询需求固定,原方案的效率更高。
内容的提问来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

