您有一个数组historyArray,其中包含一个HistoryObject 数组。每个HistoryObject 都包含一个日期字符串,格式为“MM dd, yyyy”
编辑:
(您想按日期值对历史对象进行排序。尝试按日期字符串对具有日期字符串的对象进行排序是个坏主意,因为您必须将日期字符串转换为Cocoa Date 对象用于每次比较,因此您最终会一遍又一遍地将日期转换为日期对象。在我所做的基准测试中,这会导致排序运行速度比将日期字符串批量转换为 @ 慢 1200 倍987654325@ 排序前的对象,如下所述。)
为了有效地执行此操作,您需要首先获取所有对象的Date 值。一种方法是向您的HistoryObject 添加一个惰性Date 变量,该变量是根据日期字符串计算的。如果您不想这样做,您可以:
- 使用以下方法将历史对象数组映射到日期对象数组
一个 DateFormatter。
- 使用
zip()函数组合历史对象数组和
将日期对象数组转换为元组数组。
- 对元组数组进行排序。
- 将元组数组映射回历史对象数组。
执行此操作的代码可能如下所示:
版本 1
var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM dd, yyyy"
//I don't know what your HistoryObject looks like, so I'll fake it.
struct HistoryObject: CustomStringConvertible {
let dateString: String
let value: Int
var description: String {
return "date: \(dateString), value: \(value)"
}
}
//Create an array of date strings.
let testArray = ["Jun 25, 2016", "Jun 30, 2016", "Jun 28, 2016", "Jul 2, 2016"]
//Use the array of date strings to create an array of type [HistoryObject]
let historyArray: [HistoryObject] = testArray.map {
let value = Int(arc4random_uniform(1000))
return HistoryObject(dateString: $0, value: value)
}
print("\n-----> Before sorting <-----")
historyArray.forEach { print($0) }
//Create an array of the `Dates` for each HistoryObject
let historyDates: [Date] = historyArray.map { dateFormatter.date(from: $0.dateString)!
}
//Combine the array of `Dates` and the array of `HistoryObjects` into an array of tuples
let historyTuples = zip(historyArray, historyDates)
//Sort the array of tuples and then map back to an array of type [HistoryObject]
let sortedHistoryObjects = historyTuples.sorted { $0.1 > $1.1}
.map {$0.0}
print("\n-----> After sorting <-----")
sortedHistoryObjects.forEach { print($0) }
如果您在 HistoryObject 中添加 lazy var date,则排序代码会简单很多:
版本 2:
//I don't know what your HistoryObject looks like, so I'll fake it.
class HistoryObject: CustomStringConvertible {
let dateString: String
lazy var date: Date = { dateFormatter.date(from: self.dateString)! }()
let value: Int
var description: String {
return "date: \(dateString), value: \(value)"
}
init(dateString: String, value: Int) {
self.dateString = dateString
self.value = value
}
}
//Create an array of date strings.
let testArray = ["Jun 25, 2016", "Jun 30, 2016", "Jun 28, 2016", "Jul 2, 2016"]
//Use the array of date strings to create an array of type [HistoryObject]
let historyArray: [HistoryObject] = testArray.map {
let value = Int(arc4random_uniform(1000))
return HistoryObject(dateString: $0, value: value)
}
print("\n-----> Before sorting <-----")
historyArray.forEach { print($0) }
let sortedHistoryArray = historyArray.sorted { $0.date > $1.date }
print("\n-----> After sorting <-----")
sortedHistoryArray.forEach { print($0) }