如何在Swift中对字符串数组进行排序?[重复]

csga3l58  于 2023-11-16  发布在  Swift
关注(0)|答案(2)|浏览(161)

此问题在此处已有答案

Sorting array alphabetically with number(8个答案)
12天前关闭
我尝试对一个Map了其他三个数组的数组进行排序。我的主数组是string+number i e ["Day 1","Day 2","Day 3"...]其他三个数组也是string的数组。
现在我使用下面的代码。

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"]

tuwxkamq

tuwxkamq1#

你的day数组看起来已经排序了,但以防万一你的day数组可能是unsorted,这里是我的解决方案:

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!)!
}

字符串
然而,这段代码假设你的mainDayArray总是以<string> + " " + <number>的形式出现。如果你看一下parseNumber(from:)函数,它会从检测到空格的点开始分割元素,即" ",然后从所有分割的值中,它假设最后一个是当天的数字。然后,它只是将其转换为整数。
从这里开始就很简单了,它对那些使用$0.element < $1.elementmainDayArray的数据进行排序。

**警告:**如果您的mainDayArray不正确,这将导致崩溃。请随意编辑parseNumber(from:)方法。这只是我做的一个快速实现。该方法的目标是简单地从mainDayArray中获取元素并从中检索日期。因此,只要函数实现了这一点,此代码就可以工作。

eqfvzcg8

eqfvzcg82#

如果我理解正确的话,您希望在按其值排序(降序)后,根据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将导致Day 9按照预期的顺序排列在Day 10之后。
然后,如果你实际上需要分离的数组,你可以从这个源代码中提取它们,非常简单,比如:

let sortedCompletedTimeArray = sortedStudents.map(\.time)

相关问题