Swift中如何正确排序含数字的字符串数组及关联数组?
正确排序含数字的字符串主数组并同步关联数组
问题背景
需要对格式为"Day X"的主数组排序,同时同步排序另外三个关联数组。当前代码采用字符串字典序排序,得到错误结果:
排序后主数组示例:
["Day 9","Day 8","Day 7","Day 6","Day 5","Day 4","Day 3","Day 2","Day 13","Day 12","Day 11","Day 1"]
错误根源是字符串字典序比较逻辑:"Day 13"会排在"Day 2"前面(因为字符"1"的ASCII值小于"2"),而非按数字大小排序。
解决方案
核心是提取主数组元素中的数字值,基于数值大小排序,同时保留关联数组的对应关系。以下两种实现方式均可:
方式1:打包元组后排序
将四个数组的对应元素打包成元组,排序时提取主元素的数字进行比较,再拆分回原数组结构:
var mainDayArray = ["Day 1","Day 2","Day 3","Day 4","Day 5","Day 6","Day 7","Day 8","Day 9","Day 10","Day 11","Day 12","Day 13"] var timeArray = ["06:09 PM", "06:09 PM", "06:08 PM", "06:08 PM", "06:08 PM", "06:07 PM", "06:07 PM", "06:07 PM", "06:07 PM", "06:06 PM", "06:06 PM", "06:06 PM", "06:06 PM"] var dateArray = ["Oct 1", "Oct 2", "Oct 3", "Oct 4", "Oct 5", "Oct 7", "Oct 4", "Oct 5", "Oct 9", "Nov 2", "Nov 3", "Nov 4", "Nov 01"] var studentNameArray =["as","ab","vf","sd","fd","gr","ht","jh","kl","mn","sf","ts","at"] // 打包所有关联数据为元组数组 let combinedArray = zip(zip(zip(mainDayArray, timeArray), dateArray), studentNameArray).map { ($0.0.0, $0.0.1, $0.1, $1) } // 按主数组元素的数字降序排序(升序则替换为 <) let sortedCombined = combinedArray.sorted { guard let num1 = Int($0.0.components(separatedBy: " ").last ?? ""), let num2 = Int($1.0.components(separatedBy: " ").last ?? "") else { return false } return num1 > num2 } // 拆分回各个数组 let sortedCompletedDayArray = sortedCombined.map { $0.0 } let sortedCompletedTimeArray = sortedCombined.map { $0.1 } let sortedCompletedDateArray = sortedCombined.map { $0.2 } let sortedCompletedStudentNamesArray = sortedCombined.map { $0.3 }
方式2:优化原索引排序逻辑
保留原代码的索引排序思路,修改排序逻辑为基于数字比较:
var mainDayArray = ["Day 1","Day 2","Day 3","Day 4","Day 5","Day 6","Day 7","Day 8","Day 9","Day 10","Day 11","Day 12","Day 13"] var timeArray = ["06:09 PM", "06:09 PM", "06:08 PM", "06:08 PM", "06:08 PM", "06:07 PM", "06:07 PM", "06:07 PM", "06:07 PM", "06:06 PM", "06:06 PM", "06:06 PM", "06:06 PM"] var dateArray = ["Oct 1", "Oct 2", "Oct 3", "Oct 4", "Oct 5", "Oct 7", "Oct 4", "Oct 5", "Oct 9", "Nov 2", "Nov 3", "Nov 4", "Nov 01"] var studentNameArray =["as","ab","vf","sd","fd","gr","ht","jh","kl","mn","sf","ts","at"] // 获取排序后的索引(按数字降序,升序替换为 <) let offsets = mainDayArray.enumerated().sorted { guard let num1 = Int($0.element.components(separatedBy: " ").last ?? ""), let num2 = Int($1.element.components(separatedBy: " ").last ?? "") else { return false } return num1 > num2 }.map { $0.offset } // 生成排序后的数组 let sortedCompletedDayArray = offsets.map { mainDayArray[$0] } let sortedCompletedDateArray = offsets.map { dateArray[$0] } let sortedCompletedTimeArray = offsets.map { timeArray[$0] } let sortedCompletedStudentNamesArray = offsets.map { studentNameArray[$0] }
关键说明
- 通过
components(separatedBy: " ").last提取"Day X"中的数字部分,转换为Int后进行数值比较,彻底避免字典序排序的错误。 - 如需升序排序,仅需将排序闭包中的
>替换为<即可。
内容的提问来源于stack exchange,提问作者Abhishek kumar
相关产品推荐
相关产品推荐

