2016-10-13 116 views
0

我想按日期对数据进行分组,因此我创建了自定义词典[String: [myData]]来跟踪我的数据。 (密钥将日期的值存储在String中。)另外,我发现我得到的字典是unsorted用swift排序自定义词典3

我用.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 
} 
+4

词典是无序集合。如果您想订购一个集合,也许您应该使用其他类型的集合,例如一个元组数组(其中'tupleElement.0'对应于“key”和'tupleElement.1''value“,其中后者可以用来对数组进行排序)。 – dfri

+0

哦,我明白了。我会尝试这种方式。 ty – WeiJay

+2

这个问题说字典,但你正在尝试排序一个数组。 –

回答

0

尝试下面的代码:

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] 
      } 
     } 

我认为这将是有益的。

0

的排序,这样当您尝试访问您的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]) 
}