J'ai utilisé NSSets plusieurs fois dans mes applications, mais je n'en ai jamais créé moi-même.
Quand est-il préférable d'utiliser un NSSet
plutôt que un NSArray
et pourquoi?
ios
objective-c
arrays
cocoa
cocoa-touch
geminiCoder
la source
la source
L'image de la documentation Apple le décrit très bien:
Array
est une séquence ordonnée (l'ordre est conservé lorsque vous ajoutez)Set
est une liste d'éléments distincts (pas de doublons) et non ordonnésla source
La meilleure réponse est à cela est la propre documentation d'Apple .
La principale différence est qu'il
NSArray
s'agit d'une collection ordonnée etNSSet
d'une collection non ordonnée.Il existe plusieurs articles qui parlent de la différence de vitesse entre les deux, comme celui-ci . Si vous parcourez une collection non ordonnée,
NSSet
c'est génial. Cependant, dans de nombreux cas, vous devez faire des choses que seul unNSArray
peut faire, vous sacrifiez donc la vitesse pour ces capacités.NSSet
NSArray
C'est tout ce qu'il y a vraiment à faire! Faites-moi savoir si cela vous a été utile.
la source
NSSet
pour l'indexation. Il est courant d'utiliser deux structures de données différentes pour les mêmes données. Ou vous construisez et indexez sur ce tableau :) Mais alors il est préférable d'utiliser une base de données qui l'a déjà implémentée.NSSet
etNSArray
, ma réponse est exacte et complète. Oui, vous pouvez créer d'autres structures de données, mais je compare simplement ces deux.NSArray
et de certaines fonctionnalités deNSSet
, la bonne réponse n'est pas "utiliserNSArray
et sacrifier les performances". La réponse est de combiner les deux ou d'utiliser une structure de données différente.NSOrderedSet est disponible dans iOS 5+, donc la principale différence est de savoir si vous voulez des objets en double dans la structure de données.
la source
NSArray :
NSSet :
la source
Un tableau est utilisé pour accéder aux éléments par leur index. Tout élément peut être inséré dans le tableau plusieurs fois. Les tableaux conservent l'ordre de leurs éléments.
Un ensemble est essentiellement utilisé uniquement pour vérifier si l'élément est dans la collection ou non. Les articles n'ont aucune notion de commande ou d'indexation. Vous ne pouvez pas avoir un élément dans un ensemble deux fois.
Si un tableau veut vérifier s'il contient un élément, il doit vérifier tous ses éléments. Les ensembles sont conçus pour utiliser des algorithmes plus rapides.
Vous pouvez imaginer un ensemble comme un dictionnaire sans valeurs.
Notez que tableau et ensemble ne sont pas les seules structures de données. Il y en a d'autres, par exemple Queue, Stack, Heap, Fibonacci's Heap. Je recommanderais de lire un livre sur les algorithmes et les structures de données.
Voir wikipedia pour plus d'informations.
la source
contains
opération estO(n)
. Le nombre de comparaisons lorsqu'il n'est pas dans le tableau estn
. Le nombre moyen de comparaisons lorsque l'objet est dans le tableau estn/2
. Même si l'objet est trouvé, les performances sont horribles.NSArray
s présentent d'autres avantages de vitesse par rapport auxNSSet
s. Comme toujours, c'est un compromis.le tableau
l'ensemble
la source
Les principales différences ont déjà été données dans d'autres réponses.
Je voudrais juste noter qu'en raison de la façon dont les ensembles et les dictionnaires sont implémentés (c'est-à-dire en utilisant des hachages), il faut faire attention à ne pas utiliser d'objets mutables pour les clés.
Si une clé est mutée, le hachage changera (probablement) aussi, pointant vers un autre index / compartiment dans la table de hachage. La valeur d'origine ne sera pas supprimée et sera effectivement prise en compte lors de l'énumération ou de la demande à la structure de sa taille / nombre.
Cela peut conduire à des bogues très difficiles à localiser.
la source
Ici vous trouverez une comparaison assez approfondie des
NSArray
etNSSet
datastructures.Conclusions brèves:
la source
Vous utiliserez généralement un ensemble lorsque la vitesse d'accès est essentielle et que l'ordre n'a pas d'importance , ou est déterminé par d'autres moyens (via un prédicat ou un descripteur de tri). Core Data, par exemple, utilise des ensembles lorsque des objets gérés sont accessibles via une relation à plusieurs
la source
Juste pour en ajouter un peu, j'utilise parfois set juste pour supprimer les doublons du tableau comme: -
la source