2016-10-13 11 views
0

データを日付でグループ化したいので、私のデータを追跡するためにカスタム辞書[String: [myData]]を作成します。 (キーは日付の値をStringに格納しています)また、私が得た辞書はであることが分かりましたです。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]) 
} 
関連する問題