[英]Sort custom dictionary with swift 3
我想按日期对数据进行分组,因此我创建了一个自定义词典[String: [myData]]
以跟踪我的数据。 (键将date的值存储在String中。)另外,我发现我得到的字典未排序 。
我使用.sorted(by:)
对字典进行排序,但是,它返回了另一个数据结构[(key: String, value: [myData])]
而不是我期望的[String: [myData]]
,有什么想法吗?
struct myData {
var name: String
var date: Date
init(name: String, date: Date) {
self.name = name
self.date = date
}
}
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY-MM-dd"
let x1 = myData(name: "a", date: dateFormatter.date(from: "2016-10-15")!)
let x2 = myData(name: "b", date: dateFormatter.date(from: "2016-10-15")!)
let x3 = myData(name: "z", date: dateFormatter.date(from: "2016-10-12")!)
let x4 = myData(name: "d", date: dateFormatter.date(from: "2016-10-31")!)
let x5 = myData(name: "c", date: dateFormatter.date(from: "2016-10-07")!)
let x6 = myData(name: "f", date: dateFormatter.date(from: "2016-10-06")!)
var myArr = [x1, x2, x3, x4, x5, x6]
var myArrayByDate = [String: [myData]]()
for item in myArr {
let date = dateFormatter.string(from: item.date)
myArrayByDate[date] == nil ? myArrayByDate[date] = [item] : myArrayByDate[date]?.append(item)
}
print(myArrayByDate) // unsorted
// Sorting
// sortedArray: [(key: String, value: [myData])]
let sortedArray = myArrayByDate.sorted { (s1, s2) -> Bool in
if let d1 = dateFormatter.date(from: s1.key),
let d2 = dateFormatter.date(from: s2.key) {
if d1.compare(d2) == .orderedDescending {
return true
}
}
return false
}
尝试以下代码:
struct myData {
var name: String
var date: Date
init(name: String, date: Date) {
self.name = name
self.date = date
}
}
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY-MM-dd"
let x1 = myData(name: "a", date: dateFormatter.date(from: "2016-10-15")!)
let x2 = myData(name: "b", date: dateFormatter.date(from: "2016-10-15")!)
let x3 = myData(name: "z", date: dateFormatter.date(from: "2016-10-12")!)
let x4 = myData(name: "d", date: dateFormatter.date(from: "2016-10-31")!)
let x5 = myData(name: "c", date: dateFormatter.date(from: "2016-10-07")!)
let x6 = myData(name: "f", date: dateFormatter.date(from: "2016-10-06")!)
let myArr = [x1, x2, x3, x4, x5, x6]
var myArrayByDate:[String: [myData]] = [:]
for item in myArr
{
let dateStr = dateFormatter.string(from: item.date)
if let arr = myArrayByDate[dateStr]
{
var arrayItems = arr
arrayItems.append(item)
arrayItems.sort(by: { (s1, s2) -> Bool in
if s1.date.compare(s1.date) == .orderedDescending {
return true
}
return false
})
myArrayByDate[dateStr] = arrayItems
}
else
{
myArrayByDate[dateStr] = [item]
}
}
我认为这会有所帮助。
您可以按排序方式存储myArrayByDate
字典的键 ,以便在尝试以排序方式访问myArrayByDate
字典时,可以使用先前排序的键 。
let sortedKeys = myArrayByDate.keys.sorted { s1, s2 in
guard let d1 = dateFormatter.date(from: s1) else {
return false
}
guard let d2 = dateFormatter.date(from: s2) else {
return false
}
return d1.compare(d2) == .orderedDescending
}
// print dictionary sorted
for key in sortedKeys {
print(myArrayByDate[key])
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.