Saya memiliki NSArray
yang berisi string tanggal (yaitu NSString) seperti ini: "Kam, 21 Mei 09 19:10:09 -0700"
Saya perlu mengurutkan NSArray
berdasarkan tanggal. Saya berpikir untuk mengonversi string tanggal ke NSDate
objek terlebih dahulu, tetapi terjebak di sana tentang cara mengurutkan berdasarkan NSDate
objek.
Terima kasih.
Jawaban:
Simpan tanggal sebagai
NSDate
objek dalam NS (Mutable) Array, lalu gunakan-[NSArray sortedArrayUsingSelector:
atau-[NSMutableArray sortUsingSelector:]
dan berikan@selector(compare:)
sebagai parameter. The-[NSDate compare:]
Metode akan memesan tanggal di urutan menaik untuk Anda. Ini lebih sederhana daripada membuatNSSortDescriptor
, dan jauh lebih sederhana daripada menulis fungsi perbandingan Anda sendiri. (NSDate
objek tahu cara membandingkan dirinya satu sama lain setidaknya seefisien yang bisa kami capai dengan kode kustom.)sumber
Jika saya memiliki
NSMutableArray
objek dengan bidang "beginDate" tipeNSDate
saya menggunakanNSSortDescriptor
seperti di bawah ini:NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
sumber
-[NSMutableArray sortUsingComparator:]
(10.6+) dan meneruskan blok yang mengembalikan hasil pemanggilan-compare:
pada dua bidang. Mungkin akan lebih cepat daripada memanggil-valueForKey:
setiap objek. Anda bahkan dapat menggunakan-sortWithOptions:usingComparator:
dan meneruskan opsi untuk mengurutkan secara bersamaan juga.Anda juga dapat menggunakan sesuatu seperti berikut:
//Sort the array of items by date [self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){ return [obj2.date compare:obj1.date]; }];
Tapi ini mengasumsikan bahwa tanggal disimpan sebagai
NSDate
aNString
, yang seharusnya tidak ada masalah untuk dibuat / dilakukan. Lebih disukai, saya sarankan juga menyimpan data dalam format mentahnya. Mempermudah manipulasi dalam situasi seperti ini.sumber
Anda dapat menggunakan blok untuk mengurutkan di tempat:
sortedDatesArray = [[unsortedDatesArray sortedArrayUsingComparator: ^(id a, id b) { NSDate *d1 = [NSDate dateWithString: s1]; NSDate *d2 = [NSDate dateWithString: s2]; return [d1 compare: d2]; }];
Saya sarankan Anda mengonversi semua string Anda ke tanggal sebelum menyortir untuk tidak melakukan konversi lebih banyak daripada item tanggal. Algoritme pengurutan apa pun akan memberi Anda lebih banyak string untuk konversi saat ini daripada jumlah item dalam array (terkadang jauh lebih banyak)
sedikit lebih banyak tentang penyortiran blok: http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html
sumber
Apa yang berhasil dalam kasus saya adalah sebagai berikut:
Saya punya kamus, di mana semua kunci di mana tanggal dalam format dd-MM-yyyy. Dan allKeys mengembalikan kunci kamus tanpa disortir, dan saya ingin menyajikan data dalam urutan kronologis.
sumber
Anda bisa menggunakan
sortedArrayUsingFunction:context:
. Berikut ini contohnya:NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) { NSDate *d1 = [NSDate dateWithString:s1]; NSDate *d2 = [NSDate dateWithString:s2]; return [d1 compare:d2]; } NSArray *sorted = [unsorted sortedArrayUsingFunction:dateSort context:nil];
Saat menggunakan
NSMutableArray
, Anda bisa menggunakansortArrayUsingFunction:context:
.sumber
NSDate
objek, Anda dapat menggunakan jawaban saya di atas, atau bahkan menggunakan-[NSMutableArray sortUsingComparator:]
, yang telah ditambahkan di 10.6.Setelah Anda memiliki
NSDate
, Anda dapat membuatNSSortDescriptor
denganinitWithKey:ascending:
dan kemudian digunakansortedArrayUsingDescriptors:
untuk melakukan penyortiran.sumber
Swift 3.0.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
sumber
Ubah ini
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
Untuk
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
Ubah saja KUNCI: itu harus
Date
selalusumber