Swift中如何按自定义规则(如埃及象形文字顺序)排序字符串?
Swift 实现自定义字符顺序排序(古埃及象形文字《Manuel de Codage》规则)
要实现这种自定义字符顺序的排序,最直接高效的方式是先给每个指定字符分配优先级权重,再基于权重对比字符串。不需要依赖谓词(谓词更适合过滤而非自定义排序),用Swift标准库的排序方法就能搞定,步骤如下:
第一步:构建字符优先级映射
把规则字符串里的每个字符对应到它的索引位置,索引越小,排序时优先级越高。用字典存储这个映射,方便快速查找:let customOrder = "AiyawbpfmnrhHxXzsSqkgtTdD" var charPriority: [Character: Int] = [:] for (index, char) in customOrder.enumerated() { charPriority[char] = index }第二步:实现自定义排序逻辑
利用sorted(by:)方法,遍历两个字符串的字符,逐个对比它们的优先级权重。如果某个字符不在规则里,可以根据需求处理(比如放到最后,或者按默认ASCII顺序,这里示例是放到最后):func compareStrings(_ a: String, _ b: String) -> Bool { let aChars = Array(a) let bChars = Array(b) let minLength = min(aChars.count, bChars.count) for i in 0..<minLength { let charA = aChars[i] let charB = bChars[i] guard let priorityA = charPriority[charA], let priorityB = charPriority[charB] else { // 处理不在规则里的字符,这里示例是把无优先级的字符放到后面 if charPriority[charA] == nil && charPriority[charB] != nil { return false } else if charPriority[charA] != nil && charPriority[charB] == nil { return true } else { // 都不在规则里,按默认ASCII顺序 return charA < charB } } if priorityA != priorityB { return priorityA < priorityB } } // 前面字符都相同,短字符串排前面 return aChars.count < bChars.count } // 使用示例 let stringsToSort = ["a", "A", "y", "b", "H", "x"] let sortedStrings = stringsToSort.sorted(by: compareStrings) print(sortedStrings) // 输出: ["A", "y", "a", "b", "H", "x"]补充说明
如果你的字符串都是由规则里的字符组成,那可以去掉处理无优先级字符的逻辑,让代码更简洁。另外,这种方式比每次排序时遍历规则字符串查找字符位置高效得多,因为字典的查找是O(1)时间复杂度。
内容的提问来源于stack exchange,提问作者BlueskyMed
相关产品推荐
相关产品推荐

