Saya perlu membalikkan NSArray
.
Sebagai contoh:
[1,2,3,4,5]
harus menjadi: [5,4,3,2,1]
Apa cara terbaik untuk mencapai ini?
objective-c
nsarray
Andy Jacobs
sumber
sumber
Jawaban:
Untuk mendapatkan salinan array yang terbalik, lihat solusi danielpunkass menggunakan
reverseObjectEnumerator
.Untuk membalikkan array yang bisa berubah, Anda dapat menambahkan kategori berikut ke kode Anda:
sumber
Ada solusi yang jauh lebih mudah, jika Anda memanfaatkan
reverseObjectEnumerator
metode bawaan padaNSArray
, danallObjects
metodeNSEnumerator
:allObjects
didokumentasikan sebagai mengembalikan array dengan objek yang belum dilaluinextObject
, dalam urutan:sumber
Beberapa tolok ukur
1. reverseObjectEnumerator allObjects
Ini adalah metode tercepat:
Hasil:
executionTime = 0.000026
2. Iterating melalui reverseObjectEnumerator
Ini antara 1,5x dan 2,5x lebih lambat:
Hasil:
executionTime = 0.000071
3. DiurutkanArrayUsingComparator
Ini antara 30x dan 40x lebih lambat (tidak ada kejutan di sini):
Hasil:
executionTime = 0.001100
Jadi
[[anArray reverseObjectEnumerator] allObjects]
adalah pemenang yang jelas dalam hal kecepatan dan kemudahan.sumber
enumerateObjectsWithOptions:NSEnumerationReverse
?enumerateObjectsWithOptions:NSEnumerationReverse
- yang teratas selesai dalam0.000072
hitungan detik, metode blok dalam0.000009
hitungan detik.DasBoot memiliki pendekatan yang tepat, tetapi ada beberapa kesalahan dalam kodenya. Berikut cuplikan kode yang sepenuhnya generik yang akan membalikkan NSMutableArray apa pun di tempat:
Anda dapat membungkusnya dalam fungsi C, atau untuk poin bonus, gunakan kategori untuk menambahkannya ke NSMutableArray. (Dalam hal ini, 'array' akan menjadi 'mandiri'.) Anda juga dapat mengoptimalkannya dengan menetapkan
[array count]
ke variabel sebelum loop dan menggunakan variabel itu, jika diinginkan.Jika Anda hanya memiliki NSArray biasa, tidak ada cara untuk membalikkannya, karena NSArrays tidak dapat dimodifikasi. Tetapi Anda dapat membuat salinan terbalik:
Atau gunakan trik kecil ini untuk melakukannya dalam satu baris:
Jika Anda hanya ingin mengulang array, Anda dapat menggunakan
for
/in
loop dengan[array reverseObjectEnumerator]
, tetapi sepertinya lebih efisien untuk digunakan-enumerateObjectsWithOptions:usingBlock:
:( Catatan : Secara substansial diperbarui pada 2014 dengan pengalaman Foundation selama lima tahun lagi, satu atau dua fitur Objective-C baru, dan beberapa tips dari komentar.)
sumber
Setelah meninjau jawaban yang lain di atas dan menemukan diskusi Matt Gallagher di sini
Saya mengusulkan ini:
Seperti yang diamati Matt:
Segera setelah itu, ia menjawab sebagai berikut:
sumber
Kategori Georg Schölly sangat bagus. Namun, untuk NSMutableArray, menggunakan NSUIntegers untuk indeks akan menghasilkan crash ketika array kosong. Kode yang benar adalah:
sumber
Cara paling efisien untuk menghitung array secara terbalik:
Gunakan
enumerateObjectsWithOptions:NSEnumerationReverse usingBlock
. Menggunakan patokan @ JohannesFahrenkrug di atas, ini menyelesaikan 8x lebih cepat dari[[array reverseObjectEnumerator] allObjects];
:sumber
sumber
Membalikkan array dan mengulanginya:
sumber
Untuk memperbarui ini, di Swift dapat dilakukan dengan mudah dengan:
sumber
Sedangkan untuk saya, sudahkah Anda mempertimbangkan bagaimana array dihuni di tempat pertama? Saya sedang dalam proses menambahkan objek BANYAK ke array, dan memutuskan untuk memasukkan masing-masing di awal, mendorong benda yang ada dengan satu. Membutuhkan array yang bisa berubah, dalam hal ini.
sumber
Atau cara Scala:
sumber
Ada cara mudah untuk melakukannya.
Saya harap ini membantu.
sumber
Saya tidak tahu adanya metode bawaan. Tapi, coding dengan tangan tidak terlalu sulit. Dengan asumsi elemen array yang Anda hadapi adalah objek NSNumber bertipe integer, dan 'arr' adalah NSMutableArray yang ingin Anda balikkan.
Karena Anda mulai dengan NSArray maka Anda harus membuat array yang bisa berubah terlebih dahulu dengan konten NSArray asli ('origArray').
Sunting: Memperbaiki n -> n / 2 dalam jumlah loop dan mengubah NSNumber ke id yang lebih umum karena saran dalam jawaban Brent.
sumber
Jika semua yang ingin Anda lakukan adalah beralih secara terbalik, coba ini:
Anda dapat melakukan [myArrayCount] sekali dan menyimpannya ke variabel lokal (saya pikir itu mahal), tetapi saya juga menduga bahwa kompiler akan melakukan hal yang sama dengan kode seperti yang ditulis di atas.
sumber
Sintaks Swift 3:
sumber
Coba ini:
sumber
Berikut ini adalah makro bagus yang akan berfungsi untuk NSMutableArray ATAU NSArray:
Untuk menggunakan panggilan saja:
reverseArray(myArray);
sumber