Ich habe NSSets oft in meinen Apps verwendet, aber selbst noch nie eines erstellt.
Wann ist es besser, ein NSSet
im Gegensatz zu einem zu verwenden NSArray
und warum?
ios
objective-c
arrays
cocoa
cocoa-touch
geminiCoder
quelle
quelle
Das Bild aus Apples Dokumentation beschreibt es sehr gut:
Array
ist eine geordnete Folge von Elementen (die Reihenfolge wird beim Hinzufügen beibehalten)Set
ist eine eindeutige (keine Duplikate), ungeordnete Liste von Elementenquelle
Die beste Antwort darauf ist Apples eigene Dokumentation .
Der Hauptunterschied besteht darin, dass
NSArray
es sich um eine bestellte Sammlung undNSSet
um eine ungeordnete Sammlung handelt.Es gibt mehrere Artikel, die über den Geschwindigkeitsunterschied zwischen den beiden sprechen, wie diesen hier . Wenn Sie eine ungeordnete Sammlung durchlaufen,
NSSet
ist das großartig. In vielen Fällen müssen Sie jedoch Dinge tun, die nur einNSArray
Mensch tun kann, sodass Sie die Geschwindigkeit für diese Fähigkeiten opfern.NSSet
NSArray
Das ist alles, was es wirklich zu tun gibt! Lassen Sie mich wissen, ob das hilft.
quelle
NSSet
für die Indizierung opfern . Es ist üblich, zwei verschiedene Datenstrukturen für dieselben Daten zu verwenden. Oder Sie erstellen und indizieren dieses Array :) Aber dann ist es besser, eine Datenbank zu verwenden, in der es bereits implementiert ist.NSSet
und handeltNSArray
, ist meine Antwort korrekt und vollständig. Ja, Sie können andere Datenstrukturen erstellen, aber ich vergleiche nur diese beiden.NSArray
und einige Funktionen von benötigen, lautetNSSet
die richtige Antwort nicht "Leistung nutzenNSArray
und opfern". Die Antwort ist, beide zu kombinieren oder eine andere Datenstruktur zu verwenden.NSOrderedSet ist in iOS 5+ verfügbar, sodass der Hauptunterschied darin besteht, ob Sie doppelte Objekte in der Datenstruktur möchten.
quelle
NSArray :
NSSet :
quelle
Ein Array wird verwendet, um über ihren Index auf Elemente zuzugreifen. Jedes Element kann mehrmals in das Array eingefügt werden. Arrays behalten die Reihenfolge ihrer Elemente bei.
Ein Set wird grundsätzlich nur verwendet, um zu überprüfen, ob sich der Artikel in der Sammlung befindet oder nicht. Die Artikel haben kein Konzept der Reihenfolge oder Indizierung. Sie können einen Gegenstand nicht zweimal in einem Satz haben.
Wenn ein Array überprüfen möchte, ob es ein Element enthält, muss es alle seine Elemente überprüfen. Sets sind so konzipiert, dass sie schnellere Algorithmen verwenden.
Sie können sich eine Menge wie ein Wörterbuch ohne Werte vorstellen.
Beachten Sie, dass Array und Set nicht die einzigen Datenstrukturen sind. Es gibt andere, z. B. Warteschlange, Stapel, Haufen, Fibonaccis Haufen. Ich würde empfehlen, ein Buch über Algorithmen und Datenstrukturen zu lesen.
Weitere Informationen finden Sie in Wikipedia .
quelle
contains
Operation istO(n)
. Anzahl der Vergleiche, wenn nicht im Arrayn
. Die durchschnittliche Anzahl von Vergleichen, wenn sich das Objekt im Array befindet, beträgtn/2
. Selbst wenn das Objekt gefunden wird, ist die Leistung schrecklich.NSArray
s haben andere Geschwindigkeitsvorteile gegenüberNSSet
s. Wie immer ist es ein Kompromiss.das Array
der Satz
quelle
Die Hauptunterschiede wurden bereits in anderen Antworten angegeben.
Ich möchte nur darauf hinweisen, dass aufgrund der Art und Weise, wie Mengen und Wörterbücher implementiert werden (dh Hashes verwenden), darauf geachtet werden sollte, keine veränderlichen Objekte für die Schlüssel zu verwenden.
Wenn ein Schlüssel mutiert ist, ändert sich (wahrscheinlich) auch der Hash und zeigt auf einen anderen Index / Bucket in der Hash-Tabelle. Der ursprüngliche Wert wird nicht gelöscht und tatsächlich berücksichtigt, wenn die Struktur aufgelistet oder nach ihrer Größe / Anzahl gefragt wird.
Dies kann zu einigen wirklich schwer zu lokalisierenden Fehlern führen.
quelle
Hier finden Sie einen ziemlich gründlichen Vergleich der
NSArray
und derNSSet
Datenstrukturen.Kurze Schlussfolgerungen:
quelle
Normalerweise verwenden Sie ein Set, wenn die Zugriffsgeschwindigkeit von entscheidender Bedeutung ist und die Reihenfolge keine Rolle spielt oder auf andere Weise (durch ein Prädikat oder einen Sortierdeskriptor) bestimmt wird. Core Data verwendet beispielsweise Mengen, wenn auf verwaltete Objekte über eine To-Many-Beziehung zugegriffen wird
quelle
Nur um ein bisschen davon hinzuzufügen, benutze ich set manchmal nur, um Duplikate aus dem Array zu entfernen, wie: -
quelle