Bandingkan metode
Entah Anda menerapkan metode perbandingan untuk objek Anda:
- (NSComparisonResult)compare:(Person *)otherObject {
return [self.birthDate compare:otherObject.birthDate];
}
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];
NSSortDescriptor (lebih baik)
atau biasanya lebih baik:
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];
Anda dapat dengan mudah mengurutkan berdasarkan beberapa kunci dengan menambahkan lebih dari satu ke array. Menggunakan metode pembanding khusus juga dimungkinkan. Lihat dokumentasi .
Blok (mengkilap!)
Ada juga kemungkinan penyortiran dengan blok sejak Mac OS X 10.6 dan iOS 4:
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(Person*)a birthDate];
NSDate *second = [(Person*)b birthDate];
return [first compare:second];
}];
Performa
Metode -compare:
dan berbasis blok akan sedikit lebih cepat, secara umum, daripada menggunakan NSSortDescriptor
karena yang terakhir bergantung pada KVC. Keuntungan utama dari NSSortDescriptor
metode ini adalah ia menyediakan cara untuk mendefinisikan urutan pesanan Anda menggunakan data, bukan kode, yang membuatnya mudah misalnya mengatur hal-hal sehingga pengguna dapat mengurutkan NSTableView
dengan mengklik pada baris header.
NSMutableArray
saya lebih suka menggunakan metodesortUsingDescriptors
,sortUsingFunction
atausortUsingSelector
. Sejauh array bisa berubah saya biasanya tidak memerlukan salinan yang diurutkan.Lihat
NSMutableArray
metodenyasortUsingFunction:context:
Anda perlu mengatur fungsi bandingkan yang mengambil dua objek (bertipe
Person
, karena Anda membandingkan duaPerson
objek) dan parameter konteks .Dua objek hanya contoh
Person
. Objek ketiga adalah string, misalnya @ "birthDate".Fungsi ini mengembalikan
NSComparisonResult
: Ini mengembalikanNSOrderedAscending
jikaPersonA.birthDate
<PersonB.birthDate
. Ini akan kembaliNSOrderedDescending
jikaPersonA.birthDate
>PersonB.birthDate
. Akhirnya, itu akan kembaliNSOrderedSame
jikaPersonA.birthDate
==PersonB.birthDate
.Ini adalah kodesemu kasar; Anda perlu menyempurnakan apa artinya satu tanggal menjadi "kurang", "lebih" atau "sama" dengan tanggal lain (seperti membandingkan detik-sejak-zaman dll):
Jika Anda menginginkan sesuatu yang lebih ringkas, Anda dapat menggunakan operator ternary:
Inlining mungkin bisa mempercepat ini sedikit, jika Anda melakukan ini banyak.
sumber
Saya melakukan ini di iOS 4 menggunakan blok. Harus membuang elemen array saya dari id ke tipe kelas saya. Dalam hal ini adalah kelas yang disebut Skor dengan properti yang disebut poin.
Anda juga perlu memutuskan apa yang harus dilakukan jika elemen array Anda bukan tipe yang tepat, untuk contoh ini saya baru saja kembali
NSOrderedSame
, namun dalam kode saya, saya meskipun pengecualian.PS: Ini mengurutkan dalam urutan menurun.
sumber
downcasting
tidak memerlukan gips sebelum variabel lemah.return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
Mulai di iOS 4 Anda juga dapat menggunakan blok untuk menyortir.
Untuk contoh khusus ini saya mengasumsikan bahwa objek dalam array Anda memiliki metode 'posisi', yang mengembalikan sebuah
NSInteger
.Catatan: array "diurutkan" akan autoreleased.
sumber
Saya sudah mencoba semua, tetapi ini berhasil untuk saya. Di kelas saya memiliki kelas lain bernama "
crimeScene
", dan ingin mengurutkan berdasarkan properti "crimeScene
".Ini berfungsi seperti pesona:
sumber
Ada langkah yang hilang dalam jawaban kedua Georg Schölly , tetapi itu berfungsi dengan baik kemudian.
// menambahkan 's' karena waktu terbuang ketika saya menyalin dan menempel dan gagal tanpa 's' di SortArrayUsingDescriptors
sumber
Terima kasih, ini berfungsi dengan baik ...
sumber
Person
Objek Anda perlu menerapkan metode, katakancompare:
yang mengambilPerson
objek lain , dan kembaliNSComparisonResult
sesuai dengan hubungan antara 2 objek.Kemudian Anda akan menyebutnya
sortedArrayUsingSelector:
dengan@selector(compare:)
dan itu harus dilakukan.Ada cara lain, tapi sejauh yang saya tahu tidak ada Kakao-equiv dari
Comparable
antarmuka. MenggunakansortedArrayUsingSelector:
mungkin merupakan cara yang paling mudah untuk melakukannya.sumber
iOS 4 blok akan menghemat Anda :)
http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html sedikit deskripsi
sumber
Untuk
NSMutableArray
, gunakansortUsingSelector
metode. Itu mengurutkannya-tempat, tanpa membuat contoh baru.sumber
sortUsingComparator:
.Anda dapat menggunakan metode generik berikut untuk tujuan Anda. Itu harus menyelesaikan masalah Anda.
sumber
Jika Anda hanya mengurutkan array
NSNumbers
, Anda dapat mengurutkannya dengan 1 panggilan:Itu berfungsi karena objek dalam array (
NSNumber
objek) menerapkan metode bandingkan. Anda bisa melakukan hal yang sama untukNSString
objek, atau bahkan untuk array objek data kustom yang menerapkan metode perbandingan.Berikut ini beberapa contoh kode menggunakan blok pembanding. Itu mengurutkan array kamus di mana setiap kamus menyertakan angka dalam kunci "sort_key".
Kode di atas bekerja untuk mendapatkan nilai integer untuk setiap kunci sortir dan membandingkannya, sebagai ilustrasi cara melakukannya. Karena
NSNumber
objek menerapkan metode perbandingan, itu bisa ditulis ulang jauh lebih sederhana:atau badan pembanding bahkan bisa disuling menjadi 1 baris:
Saya cenderung lebih suka pernyataan sederhana dan banyak variabel sementara karena kodenya lebih mudah dibaca, dan lebih mudah di-debug. Kompiler mengoptimalkan variabel sementara, jadi tidak ada keuntungan untuk versi all-in-one-line.
sumber
Saya telah membuat perpustakaan kecil metode kategori, yang disebut Linq to ObjectiveC , yang membuat hal semacam ini lebih mudah. Menggunakan metode pengurutan dengan pemilih kunci, Anda dapat mengurutkan
birthDate
sebagai berikut:sumber
Saya baru saja melakukan penyortiran multi level berdasarkan kebutuhan khusus.
// sortir nilainya
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec
sumber
Saya telah menggunakan sortUsingFunction :: di beberapa proyek saya:
sumber
Anda menggunakan NSSortDescriptor untuk mengurutkan NSMutableArray dengan objek kustom
sumber
sumber
Penyortiran
NSMutableArray
sangat sederhana:sumber
Sortir menggunakan NSComparator
Jika kita ingin mengurutkan objek khusus yang perlu kita sediakan
NSComparator
, yang digunakan untuk membandingkan objek kustom. Blok mengembalikanNSComparisonResult
nilai untuk menunjukkan urutan dua objek. Jadi untuk mengurutkan seluruh arrayNSComparator
digunakan dengan cara berikut.Mengurutkan Menggunakan NSSortDescriptor
Mari kita asumsikan, sebagai contoh, bahwa kita memiliki array yang berisi instance dari kelas kustom, Karyawan memiliki atribut firstname, lastname, dan age. Contoh berikut menggambarkan cara membuat NSSortDescriptor yang dapat digunakan untuk mengurutkan konten array dalam urutan menaik dengan kunci usia.
Mengurutkan menggunakan Perbandingan Kustom
Nama adalah string, dan ketika Anda mengurutkan string untuk disajikan kepada pengguna, Anda harus selalu menggunakan perbandingan yang dilokalkan. Seringkali Anda juga ingin melakukan perbandingan kasus yang tidak sensitif. Inilah contoh dengan (localizedStandardCompare :) untuk memesan array dengan nama belakang dan nama depan.
Untuk referensi dan diskusi terperinci silakan merujuk: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials / objective-c / how-to-sort-nsarray-with-custom-objects /
sumber
Protokol dan pemrograman fungsional Swift membuatnya sangat mudah, Anda hanya perlu membuat kelas Anda sesuai dengan protokol Sebanding, mengimplementasikan metode yang diperlukan oleh protokol dan kemudian menggunakan fungsi urutan tinggi (oleh:) untuk membuat array yang diurutkan tanpa perlu menggunakan array bisa berubah dengan cara.
sumber
Dalam kasus saya, saya menggunakan "sortArrayUsingComparator" untuk mengurutkan array. Lihatlah kode di bawah ini.
Juga objek saya adalah,
sumber
Anda harus membuat sortDescriptor dan kemudian Anda dapat mengurutkan nsmutablearray dengan menggunakan sortDescriptor seperti di bawah ini.
sumber
Gunakan seperti ini untuk objek bersarang,
lastRoute adalah satu objek dan objek itu memegang objek to, objek yang memegang nilai string nama belakang.
sumber
Sortir Array Dalam Swift
Untuk
Swifty
Orang di bawah ini adalah teknik yang sangat bersih untuk mencapai tujuan di atas secara global. Mari kita memiliki contoh kelas khususUser
yang memiliki beberapa atribut.Sekarang kita memiliki array yang perlu kita sortir berdasarkan
createdDate
naik dan / atau turun. Jadi mari kita tambahkan fungsi untuk perbandingan tanggal.Sekarang mari kita memiliki
extension
dariArray
untukUser
. Dengan kata sederhana, mari kita tambahkan beberapa metode hanya untuk Array yang hanya memilikiUser
objek di dalamnya.Penggunaan untuk Ascending Order
Penggunaan untuk Pesanan Menurun
Penggunaan untuk Pesanan yang Sama
sumber
Versi cepat: 5.1
Jika Anda memiliki struct atau kelas kustom dan ingin mengurutkannya secara sewenang-wenang, Anda harus memanggil sort () menggunakan trailing closure yang mengurutkan pada bidang yang Anda tentukan. Berikut ini contoh menggunakan array struct khusus yang mengurutkan pada properti tertentu:
Jika Anda ingin mengembalikan array yang diurutkan daripada mengurutkannya, gunakan sortir () seperti ini:
sumber
sumber
sumber