我有一个数组 SetDataList ,其中填充了以下信息:
["2019-04-30 Set 1: 8 Reps 55kg", "2019-05-02 Set 1: 5 Reps 70kg", "2019-05-02 Set 2: 4 Reps 70kg", "2019-05-02 Set 3: 2 Reps 75kg"]
我目前正在使用以下代码对数组进行排序,以便将集合1、2和3分组并按上面的数组显示。
SetDataList.sort(by: {$0 < $1})
但是,我也想按日期降序对数组进行排序。我以前通过使用以下代码执行了此操作,尽管这种方法会扰乱设置顺序。
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let ordered = SetDataList.sorted { string1, string2 in
guard let date1 = dateFormatter.date(from: string1), let date2 = dateFormatter.date(from: string2) else { return false }
return date1 < date2
}
如何实现多种分类?谢谢
答案 0 :(得分:0)
我建议使用结构而不是字符串,例如:
struct SetData {
let setNumber: Int
let date: Date
let reps: Int
let weight: Int
}
让我们从这个数组开始:
let setDataList = ["2019-04-30 Set 1: 8 Reps 55kg",
"2019-05-02 Set 10: 20 Reps 70kg",
"2019-05-02 Set 1: 5 Reps 70kg",
"2019-05-02 Set 2: 4 Reps 70kg",
"2019-05-02 Set 3: 2 Reps 75kg"].shuffled()
假设数组中的字符串都具有相同的格式,则可以通过以下方式对setDataList
进行排序:
let sorted = setDataList.sorted { string1, string2 in
let dateDelimiter = string1.index(string1.startIndex, offsetBy: 9)
let earlierDate = string1[...dateDelimiter] < string2[...dateDelimiter]
if earlierDate { return true }
let firstSetStart = string1.index(string1.startIndex, offsetBy: 17)
var firstSetEnd = firstSetStart
while firstSetEnd < string1.endIndex,
string1[firstSetEnd] != ":" {
firstSetEnd = string1.index(after: firstSetEnd)
}
let secondSetStart = string2.index(string2.startIndex, offsetBy: 17)
var secondSetEnd = secondSetStart
while secondSetEnd < string2.endIndex,
string2[secondSetEnd] != ":" {
secondSetEnd = string2.index(after: secondSetEnd)
}
let sub1 = string1[firstSetStart..<firstSetEnd]
let sub2 = string2[secondSetStart..<secondSetEnd]
guard let setNbr1 = Int(sub1), let setNbr2 = Int(sub2) else {
fatalError("Wrong string structure")
}
return setNbr1 < setNbr2
}
您可以通过以下方式检查结果:
for element in sorted {
print(element)
}
哪些印刷品:
2019-04-30 Set 1: 8 Reps 55kg 2019-05-02 Set 1: 5 Reps 70kg 2019-05-02 Set 2: 4 Reps 70kg 2019-05-02 Set 3: 2 Reps 75kg 2019-05-02 Set 10: 20 Reps 70kg