提问人:Abhishek kumar 提问时间:11/1/2023 最后编辑:Mojtaba HosseiniAbhishek kumar 更新时间:11/1/2023 访问量:84
如何在swift中对字符串数字数组进行排序?[复制]
How to sort string numeric array in swift? [duplicate]
问:
我正在尝试对与其他三个数组映射的数组进行排序。
我的主数组是字符串+数字 i e 其他三个数组也是字符串数组。["Day 1","Day 2","Day 3"...]
现在我正在使用以下代码。
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 { $0.element > $1.element }.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] }
但我在这里得到了错误的数据。我得到的输出如下:
mainDayArray = ["Day 9","Day 8","Day 7","Day 6","Day 5","Day 4","Day 3","Day 2","Day 13","Day 12","Day 11","Day 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 offsets = mainDayArray.map(parseNumber).enumerated().sorted { $0.element < $1.element }.map(\.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] }
/// Parses the day number from an array element stored in the `mainDayArray`.
/// - Parameter element: An element from the `mainDayArray`.
/// - Returns: The day number.
func parseNumber(from element: String) -> Int {
Int(element.split(separator: " ").last!)!
}
但是,此代码假定 u 将始终采用 的形式。如果你看一下这个函数,它会从它检测到一个空格的点(即 ,)拆分元素,然后从所有拆分值中假设最后一个将是当天的数字。然后,它只是将其转换为整数。mainDayArray
<string> + " " + <number>
parseNumber(from:)
" "
从那里开始,这非常简单。它对那些使用并将进行排序的人进行排序。$0.element < $1.element
mainDayArray
警告:如果您的格式不正确,这将导致崩溃。您可以根据需要随意编辑方法。这只是我所做的一个快速实现。该方法的目标是简单地从 中获取一个元素并从中检索日期编号。因此,只要通过函数实现这一点,此代码就会起作用。mainDayArray
parseNumber(from:)
mainDayArray
如果我理解正确,您希望在按其值对数组进行排序(降序)后,根据 的顺序对所有数组进行排序。mainDate
我建议首先构建一个结构并将所有数据封装在一起,如下所示:
struct Student {
let mainDate: String
let time: String
let date: String
let name: String
}
let students = (0..<mainDayArray.count).map {
Student(
mainDate: mainDayArray[$0],
time: timeArray[$0],
date: dateArray[$0],
name: studentNameArray[$0]
)
}
然后,您可以按照所需的顺序按所需的任何属性进行排序,例如:
✅ 关于对数字字符串进行排序的具体问题的答案在这里
let sortedStudents = students.sorted(using: KeyPathComparator(\.mainDate, comparator: .localizedStandard, order: .reverse))
在这里,我根据学生的 mainDate
按数字顺序对学生进行排序。请注意,传递 localizedStandard
将导致第 9
天按预期在第 10 天
之后排序。
然后,如果你真的需要单独的数组,你可以从这个源中提取它们,非常简单,比如:
let sortedCompletedTimeArray = sortedStudents.map(\.time)
评论
sortedCompletedDayArray