2016-10-13 3 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]) 
} 
Смежные вопросы