Słowniki nie mogą być sortowane, więc musisz przekonwertować je na tablicę. Funkcja map
może zrobić to za Ciebie. Ponadto ciągi nie mogą być sortowane tak, jak to przewidziano, więc albo trzeba zmienić strukturę ciągu na format yyyy-MM-dd
, albo przekonwertować go na datę.
Ale kiedy już to zrobisz, możesz posortować tablicę. Na przykład za pomocą programowania funkcyjnego w Swift, można zrobić coś jak poniżej, który wykorzystuje map
przekonwertować słownika do tablicy krotek, a następnie używa sorted
uporządkować je, używając NSDateFormatter
przekonwertować ciągi do dat:
var dayTotalDictionary: [String:Int] = [
"04-09-2015" : 4,
"04-10-2015" : 6,
"04-07-2015" : 8,
"03-28-2015" : 10,
"12-10-2014" : 12,
"12-10-2015" : 12
]
let formatter = NSDateFormatter()
formatter.dateFormat = "MM-dd-yyyy"
let dayTotalArray = map(dayTotalDictionary) { ($0, $1) }
.sorted() { formatter.dateFromString($0.0)!.compare(formatter.dateFromString($1.0)!) == .OrderedAscending }
Mimo że cieszy się pewną prostotą, jest to prawdopodobnie mało wydajna metoda, wymagająca więcej niż potrzeba. Tak, pewnie bym mieć funkcja map
dodać obiekt NSDate
do tablicy krotek, a następnie sorted
mogą skorzystać z NSDate
obiektu, który już tam jest:
let dayTotalArray = map(dayTotalDictionary) { (formatter.dateFromString($0)!, $0, $1) } // in Swift 2.0, use `dayTotalDictionary.map()`
.sorted() { ($0.0 as NSDate).compare($1.0 as NSDate) == .OrderedAscending } // in Swift 2.0, use `sort`
.map() { (_, dateString, dayTotal) in (dateString, dayTotal) }
To ostateczna map
wyciąga przedmiot NSDate
, ale wyraźnie nie musisz tego robić, jeśli dobrze trzymasz NSDate
w krotce.
W większości języków nie można sortować kluczy w słowniku. To nie jest punkt słownika. Słownik służy do wstawiania i pobierania w stałym czasie. I dla kluczy, które nie są liczbami całkowitymi. Jeśli umieścisz pary wartości kluczy w liście, możesz je posortować. –
dayTotalArrayTest nie jest tablicą, jest słownikiem. Nie możesz tak naprawdę posortować słownika –