如何以Geofire键数组为参考对Venue对象数组按venueID排序?
按参考数组顺序排序Venue数组的Swift实现方案
我来帮你搞定这个排序需求!根据你提到的思路,我们可以用字典建立索引的方式实现高效排序,同时完美适配你要求的逃逸闭包返回逻辑。
完整实现代码
func sortVenues(unsortedArray: [Venue], sortingGeoArray: [String], completion: @escaping ([Venue]) -> Void) { // 建立venueID到Venue对象的映射字典,实现O(1)时间复杂度的查找 let venueIDMap = Dictionary(uniqueKeysWithValues: unsortedArray.map { ($0.venueID, $0) }) // 按照参考数组的顺序提取对应Venue,自动完成排序 let sortedVenues = sortingGeoArray.compactMap { venueIDMap[$0] } // 通过逃逸闭包返回排序后的结果 completion(sortedVenues) }
代码逻辑拆解
- 建立映射字典:我们把未排序数组里的每个
Venue对象,用它的venueID作为key存入字典。这一步相当于给所有venue做了个“快捷查找表”,后续查找单个venue的速度从O(n)降到了O(1),数据量大的时候优势特别明显。 - 按参考数组排序:用
compactMap遍历sortingGeoArray,逐个从字典里取出对应的Venue对象。compactMap会自动忽略那些在未排序数组里找不到的venueID(也就是字典里不存在的key),最终得到的数组顺序完全和参考数组一致。 - 逃逸闭包返回:最后把排序好的数组通过
completion闭包返回,满足你需要的异步返回要求。
扩展场景补充
如果你需要保留未排序数组里所有元素(包括那些不在参考数组里的venue),可以在排序后追加剩余元素:
func sortVenuesWithRemaining(unsortedArray: [Venue], sortingGeoArray: [String], completion: @escaping ([Venue]) -> Void) { let venueIDMap = Dictionary(uniqueKeysWithValues: unsortedArray.map { ($0.venueID, $0) }) let sortedVenues = sortingGeoArray.compactMap { venueIDMap[$0] } // 筛选出参考数组里没有的venue,追加到排序结果后面 let remainingVenues = unsortedArray.filter { !sortingGeoArray.contains($0.venueID) } let finalSortedVenues = sortedVenues + remainingVenues completion(finalSortedVenues) }
内容的提问来源于stack exchange,提问作者Roggie
相关产品推荐
相关产品推荐

