Wiele razy korzystałem z NSSets w moich aplikacjach, ale nigdy nie stworzyłem ich samodzielnie.
Kiedy lepiej jest używać an NSSet
zamiast an NSArray
i dlaczego?
ios
objective-c
arrays
cocoa
cocoa-touch
geminiCoder
źródło
źródło
Obraz z Dokumentacji Apple opisuje to bardzo dobrze:
Array
to uporządkowana (kolejność jest zachowywana podczas dodawania) sekwencji elementówSet
jest odrębną (bez duplikatów), nieuporządkowaną listą elementówźródło
Najlepszą odpowiedzią na to jest własna dokumentacja Apple .
Główna różnica polega na tym, że
NSArray
dotyczy kolekcji zamówionej iNSSet
nieuporządkowanej.Istnieje kilka artykułów, które mówią o różnicy w prędkości między nimi, jak ten . Jeśli przeglądasz nieuporządkowaną kolekcję,
NSSet
to świetnie. Jednak w wielu przypadkach musisz robić rzeczy, które tylko onNSArray
może zrobić, więc poświęcasz prędkość dla tych umiejętności.NSSet
NSArray
Tak naprawdę to wszystko! Jeśli to pomoże, to daj mi znać.
źródło
NSSet
na rzecz indeksowania. Często używa się dwóch różnych struktur danych dla tych samych danych. Albo budujesz i indeksujesz na tej tablicy :) Ale wtedy lepiej jest użyć bazy danych, która ma już zaimplementowaną.NSSet
iNSArray
, moja odpowiedź jest dokładna i kompletna. Tak, możesz budować inne struktury danych, ale ja tylko porównuję te dwie.NSArray
i jakiejś funkcjonalności zNSSet
, poprawną odpowiedzią nie jest „używajNSArray
i poświęć wydajność”. Odpowiedź brzmi: połącz oba lub użyj innej struktury danych.NSOrderedSet jest dostępny w iOS 5+, więc główna różnica polega na tym, czy chcesz zduplikować obiekty w strukturze danych.
źródło
NSArray :
NSSet :
źródło
Tablica służy do uzyskiwania dostępu do elementów według ich indeksu. Dowolny element można wstawić do tablicy wielokrotnie. Tablice zachowują kolejność swoich elementów.
Zestaw jest używany w zasadzie tylko do sprawdzenia, czy przedmiot jest w kolekcji, czy nie. Pozycje nie mają pojęcia kolejności ani indeksowania. Nie możesz mieć elementu w zestawie dwukrotnie.
Jeśli tablica chce sprawdzić, czy zawiera element, musi sprawdzić wszystkie jej elementy. Zestawy są zaprojektowane do korzystania z szybszych algorytmów.
Możesz sobie wyobrazić zbiór jak słownik bez wartości.
Zauważ, że tablica i zbiór nie są jedynymi strukturami danych. Istnieją inne, np. Queue, Stack, Heap, Fibonacci's Heap. Poleciłbym przeczytać książkę o algorytmach i strukturach danych.
Więcej informacji można znaleźć w Wikipedii .
źródło
contains
operacji toO(n)
. Liczba porównań, gdy nie ma w tablicy, wynosin
. Średnia liczba porównań, gdy obiekt znajduje się w tablicy, wynosin/2
. Nawet jeśli obiekt zostanie znaleziony, wydajność jest okropna.NSArray
s mają inne zalety szybkości w stosunku doNSSet
s. Jak zawsze, to kompromis.tablica
zestaw
źródło
Główne różnice zostały już podane w innych odpowiedziach.
Chciałbym tylko zauważyć, że ze względu na sposób implementacji zestawów i słowników (tj. Za pomocą skrótów), należy uważać, aby nie używać obiektów mutowalnych dla kluczy.
Jeśli klucz jest zmutowany, to hash (prawdopodobnie) również się zmieni, wskazując na inny indeks / zasobnik w tablicy hash. Oryginalna wartość nie zostanie usunięta i będzie faktycznie brana pod uwagę przy wyliczaniu lub pytaniu struktury o jej rozmiar / liczbę.
Może to prowadzić do naprawdę trudnych do zlokalizowania błędów.
źródło
Tutaj można znaleźć dość dokładne porównanie struktur
NSArray
iNSSet
danych.Krótkie wnioski:
źródło
Zwykle używasz zestawu, gdy szybkość dostępu jest najważniejsza, a kolejność nie ma znaczenia lub jest określana w inny sposób (za pomocą predykatu lub deskryptora sortowania). Na przykład dane podstawowe używają zestawów, gdy dostęp do obiektów zarządzanych uzyskuje się za pośrednictwem relacji to-many
źródło
Żeby dodać trochę tego, używam czasami seta tylko po to, aby usunąć duplikaty z tablicy, takie jak: -
źródło