对File数组按类型分组及dir优先的多规则排序实现问询
解决方案:Swift 中 File 数组的分组与排序
针对你提出的File数组分组排序需求,我整理了一套清晰的实现方案,直接上代码加详细解释:
首先,先确认我们的File类定义(加上一个测试用的构造器方便验证):
class File { var name: String? var type: String? var timeStamp: Date? // 测试用构造器 init(name: String?, type: String?, timeStamp: Date?) { self.name = name self.type = type self.timeStamp = timeStamp } } // 示例数组 let array = [ File(name: "Docs", type: "dir", timeStamp: Date()), File(name: "Photo1", type: "jpg", timeStamp: Date().addingTimeInterval(-3600)), File(name: "Videos", type: "dir", timeStamp: Date()), File(name: "Pic2", type: "png", timeStamp: Date().addingTimeInterval(-7200)), File(name: "Clip", type: "mov", timeStamp: Date().addingTimeInterval(-1800)) ]
完整实现步骤
// 1. 按文件类型分组,处理type为nil的情况(归到空字符串组) var groupedFiles = Dictionary(grouping: array) { $0.type ?? "" } // 2. 定义分组优先级:dir组排在最前面,其余类型按名称排序(保证结果稳定) let desiredGroupOrder = ["dir"] + groupedFiles.keys.filter { $0 != "dir" }.sorted() // 3. 对每个分组内的文件进行排序 var sortedResult: [(type: String, files: [File])] = [] for type in desiredGroupOrder { guard var filesInGroup = groupedFiles[type] else { continue } if type == "dir" { // 目录组按name字段排序,处理name为nil的情况(有名称的在前) filesInGroup.sort { guard let nameA = $0.name, let nameB = $1.name else { return $0.name != nil && $1.name == nil } // 用本地化排序更符合文件名排序习惯(忽略大小写、数字自然排序) return nameA.localizedStandardCompare(nameB) == .orderedAscending } } else { // 非目录组按timeStamp排序,处理timeStamp为nil的情况(有时间的在前) filesInGroup.sort { guard let timeA = $0.timeStamp, let timeB = $1.timeStamp else { return $0.timeStamp != nil && $1.timeStamp == nil } // 这里是按时间从新到旧排序,若要旧到新改成 timeA < timeB return timeA > timeB } } sortedResult.append((type: type, files: filesInGroup)) } // 可选:如果需要把所有文件按顺序合并成一个单一数组 let finalSortedArray = sortedResult.flatMap { $0.files }
关键细节说明
- 分组逻辑:用
Dictionary(grouping:by:)快速完成分组,同时处理了type为nil的边缘情况,避免分组混乱。 - 分组顺序:手动指定
dir为第一个分组,其余类型按名称排序,保证输出结果的稳定性(如果不需要排序可以跳过sorted())。 - 组内排序:
- 目录组使用
localizedStandardCompare做本地化排序,比普通的字符串比较更适合文件名场景(比如"File2"会排在"File10"前面,忽略大小写)。 - 非目录组按时间戳排序,同时处理了
timeStamp为nil的情况,避免排序时出现崩溃或异常。
- 目录组使用
- 结果形式:最终
sortedResult是一个包含分组类型和对应排序后文件的数组,如果你需要单一的排序后数组,用flatMap拼接即可。
内容的提问来源于stack exchange,提问作者Amrit Sidhu
相关产品推荐
相关产品推荐

