Swift:排序后字典元素数组转回字典及搜索优化方案咨询
解决[String: CustomUserInfo]字典的搜索结果转换与优化问题
我来帮你一步步搞定这两个问题:
问题1:将排序后的数组转回[String: CustomUserInfo]字典
Swift 的Dictionary提供了一个专门的初始化方法init(uniqueKeysWithValues:),刚好能把包含键值对元组的数组直接转成字典——因为你的原字典键是唯一的,排序后的数组里的键也不会重复,所以可以放心使用:
let resultDictionary = Dictionary(uniqueKeysWithValues: sortedUsers)
把这段代码加到你的searchUsers方法里,就能得到目标字典类型了。修改后的方法片段:
func searchUsers(by searchString: String) { let searchString = searchString.lowercased() let filteredUsers = Users.users.filter { $0.1.displayName.lowercased() >= searchString } var sortedUsers = filteredUsers.sorted { $0.1 < $1.1 } if sortedUsers.count > 3 { sortedUsers.removeLast(sortedUsers.count - 3) } // 转成目标字典 let resultDict = Dictionary(uniqueKeysWithValues: sortedUsers) print(resultDict) }
问题2:优化流程,直接获取3个最相关的字典结果
当然可以优化!我们可以把过滤、排序、取前3、转字典这几步合并成链式调用,不用单独维护数组变量,代码更简洁,也跳过了“转数组再转回字典”的冗余操作:
核心逻辑是:先过滤出符合条件的键值对,按displayName排序,直接取前3个元素,最后一步转成字典。
修改后的完整searchUsers方法:
func searchUsers(by searchString: String) { let searchLowercased = searchString.lowercased() let resultDict = Dictionary(uniqueKeysWithValues: Users.users .filter { $0.1.displayName.lowercased() >= searchLowercased } .sorted { $0.1 < $1.1 } .prefix(3) // 直接取前3个,无需判断长度再移除元素 ) print(resultDict) }
这里用prefix(3)替代了原来的判断和移除操作,代码更精简。整个流程一步到位得到目标字典,同时保留了通过键访问CustomUserInfo对象的能力。
小补充:如果你的用户字典规模极大,全量排序再取前3可能有性能损耗,但日常场景下这个写法已经足够高效简洁。如果追求极致性能,可以考虑用堆结构维护前3个匹配元素,但一般情况下没必要~
内容的提问来源于stack exchange,提问作者Marco Boerner
相关产品推荐
相关产品推荐

