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

How to sort string numeric array in swift? [duplicate]

提问人:Abhishek kumar 提问时间:11/1/2023 最后编辑:Mojtaba HosseiniAbhishek kumar 更新时间:11/1/2023 访问量:84

问:

我正在尝试对与其他三个数组映射的数组进行排序。 我的主数组是字符串+数字 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"]
数组 快速 排序

评论

3赞 Joakim Danielson 11/1/2023
使用自定义结构,而不是将值放在不同的数组中
0赞 Abhishek kumar 11/1/2023
嗨,HangerRash,这不能回答我的问题。这仅适用于两个数组,但我有 4 个数组。使用它时,我遇到了“调用下标没有完全匹配”的问题
0赞 MadProgrammer 11/1/2023
@Abhishekkumar我会看到 JoakimDanielson 的评论 - 使用四个“依赖索引”的数组似乎很奇怪
0赞 Abhishek kumar 11/1/2023
嗨,Joakim,实际上它已经是这样编码的。
0赞 MadProgrammer 11/1/2023
@Abhishekkumar 此外,根据 HangerRash 的链接示例,我让您的代码(我假设)可以工作(或至少按正确的顺序)sortedCompletedDayArray

答:

0赞 rayaantaneja 11/1/2023 #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.elementmainDayArray

警告:如果您的格式不正确,这将导致崩溃。您可以根据需要随意编辑方法。这只是我所做的一个快速实现。该方法的目标是简单地从 中获取一个元素并从中检索日期编号。因此,只要通过函数实现这一点,此代码就会起作用。mainDayArrayparseNumber(from:)mainDayArray

0赞 Mojtaba Hosseini 11/1/2023 #2

如果我理解正确,您希望在按其值对数组进行排序(降序)后,根据 的顺序对所有数组进行排序。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)