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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:47:39