Saya telah menggunakan NSSets berkali-kali di aplikasi saya, tetapi saya tidak pernah membuatnya sendiri.
Kapan lebih baik menggunakan an NSSet
sebagai lawan NSArray
dan mengapa?
ios
objective-c
arrays
cocoa
cocoa-touch
geminiCoder
sumber
sumber
Gambar dari Dokumentasi Apple menggambarkannya dengan sangat baik:
Array
adalah sebuah memerintahkan (agar dipertahankan ketika Anda menambahkan) urutan elemenSet
adalah daftar elemen yang berbeda (tidak ada duplikat) dan tidak berurutansumber
Jawaban terbaik untuk ini adalah dokumentasi Apple sendiri .
Perbedaan utamanya
NSArray
adalah untuk koleksi yang dipesan danNSSet
untuk koleksi yang tidak diurutkan .Ada beberapa artikel di luar sana yang membahas tentang perbedaan kecepatan antara keduanya, seperti ini . Jika Anda mengulang melalui koleksi yang tidak diurutkan,
NSSet
itu bagus. Namun, dalam banyak kasus, Anda perlu melakukan hal-hal yang hanyaNSArray
dapat dilakukan, jadi Anda mengorbankan kecepatan untuk kemampuan tersebut.NSSet
NSArray
Hanya itu yang benar-benar ada untuk itu! Beri tahu saya jika itu membantu.
sumber
NSSet
demi pengindeksan. Biasanya menggunakan dua struktur data yang berbeda untuk data yang sama. Atau Anda membangun dan mengindeks pada array tersebut :) Tapi lebih baik menggunakan DB yang sudah diimplementasikan.NSSet
danNSArray
, jawaban saya akurat dan lengkap. Ya, Anda dapat membangun struktur data lain, tetapi saya hanya membandingkan keduanya.NSArray
dan beberapa fungsi dariNSSet
, jawaban yang benar bukanlah "menggunakanNSArray
dan mengorbankan kinerja". Jawabannya adalah menggabungkan keduanya atau menggunakan struktur data yang berbeda.NSOrderedSet tersedia di iOS 5+ sehingga perbedaan utamanya adalah apakah Anda ingin objek duplikat dalam struktur data.
sumber
NSArray :
NSSet :
sumber
Sebuah array digunakan untuk mengakses item dengan indeksnya. Item apa pun dapat dimasukkan ke dalam array beberapa kali. Array menjaga urutan elemennya.
Satu set pada dasarnya digunakan hanya untuk memeriksa apakah item tersebut ada dalam koleksi atau tidak. Item tidak memiliki konsep urutan atau pengindeksan. Anda tidak dapat memiliki item dalam satu set dua kali.
Jika sebuah array ingin memeriksa apakah mengandung sebuah elemen, ia harus memeriksa semua itemnya. Set dirancang untuk menggunakan algoritme yang lebih cepat.
Anda bisa membayangkan satu set seperti kamus tanpa nilai.
Perhatikan bahwa array dan set bukanlah satu-satunya struktur data. Ada yang lainnya, misal Queue, Stack, Heap, Fibonacci's Heap. Saya akan merekomendasikan membaca buku tentang algoritma dan struktur data.
Lihat wikipedia untuk informasi lebih lanjut.
sumber
contains
operasinyaO(n)
. Jumlah perbandingan jika tidak ada dalam arrayn
. Jumlah rata-rata perbandingan saat objek berada dalam larik adalahn/2
. Bahkan jika objeknya ditemukan, kinerjanya buruk.NSArray
s memiliki keunggulan kecepatan lainnya dibandingkanNSSet
s. Seperti biasa, ini adalah pengorbanan.larik
set
sumber
Perbedaan utama telah diberikan dalam jawaban lain.
Saya hanya ingin mencatat bahwa karena cara set dan kamus diimplementasikan (yaitu menggunakan hash), seseorang harus berhati-hati untuk tidak menggunakan objek yang bisa berubah untuk kunci.
Jika kunci dimutasi maka hash (mungkin) juga akan berubah, menunjuk ke indeks / keranjang yang berbeda dalam tabel hash. Nilai asli tidak akan dihapus dan akan benar-benar diperhitungkan saat menghitung atau menanyakan struktur untuk ukuran / hitungannya.
Ini dapat menyebabkan beberapa bug sangat sulit ditemukan.
sumber
Di sini Anda dapat menemukan perbandingan yang cukup menyeluruh dari struktur data
NSArray
danNSSet
.Kesimpulan singkat:
sumber
Anda biasanya akan menggunakan Set ketika kecepatan akses adalah yang terpenting dan urutan tidak penting , atau ditentukan dengan cara lain (melalui predikat atau deskriptor sortir). Data Inti misalnya menggunakan set ketika objek yang dikelola diakses melalui hubungan ke banyak
sumber
Hanya untuk menambahkan sedikit saja saya menggunakan set kadang-kadang hanya untuk menghapus duplikat dari array seperti: -
sumber