You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:27:58