2016-10-13 3 views
0

Ich möchte meine Daten nach Datum gruppieren, so erstellen ich ein Benutzerwörterbuch [String: [myData]], um meine Daten zu verfolgen. (Der Schlüssel speichert den Wert des Datums in String.) Außerdem habe ich festgestellt, dass das Wörterbuch unsortiert ist.Sortieren Benutzerwörterbuch mit Swift 3

Ich habe .sorted(by:) verwendet, um mein Wörterbuch zu sortieren, jedoch gibt es eine andere Datenstruktur [(key: String, value: [myData])] statt, was ich erwartet [String: [myData]], irgendeine Idee?

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

Wörterbücher sind ungeordnete Sammlungen. Wenn Sie eine Sammlung mit Bestellung wünschen, sollten Sie vielleicht eine andere Art von Sammlung verwenden, z. ein Array von Tupeln (wobei "tupleElement.0" "key" und "tupleElement.1" "value" entsprechen würde, wobei Letzteres dazu verwendet werden könnte, das Array zu sortieren). – dfri

+0

Oh ich sehe. Ich werde es versuchen. ty – WeiJay

+2

Die Frage sagt Wörterbuch, aber Sie versuchen, ein Array zu sortieren. –

Antwort

0

Versuchen folgenden Code:

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

ich denke, es hilfreich sein wird.

0

könnten Sie speichern die Tasten des Wörterbuchs myArrayByDate als sortiert, so dass, wenn Sie myArrayByDate Wörterbuch in sortierter Art und Weise Zugriff auf Ihre versuchen, Ihnen die Schlüssel sortiert vorher benutzen konnten.

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