繁体   English   中英

快速排序自定义词典3

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM