He usado NSSets muchas veces en mis aplicaciones, pero nunca he creado uno.
¿Cuándo es mejor utilizar an NSSet
en lugar de an NSArray
y por qué?
ios
objective-c
arrays
cocoa
cocoa-touch
geminiCoder
fuente
fuente
La imagen de la documentación de Apple lo describe muy bien:
Array
es una secuencia ordenada (el orden se mantiene cuando agrega) de elementosSet
es una lista de elementos distinta (sin duplicados) y desordenadafuente
La mejor respuesta es la propia documentación de Apple .
La principal diferencia es que
NSArray
es para una colección ordenada yNSSet
es para una colección desordenada.Hay varios artículos que hablan sobre la diferencia de velocidad entre los dos, como este . Si está iterando a través de una colección desordenada,
NSSet
es genial. Sin embargo, en muchos casos, necesitas hacer cosas que solo unoNSArray
puede hacer, por lo que sacrificas la velocidad por esas habilidades.NSSet
NSArray
¡Eso es todo lo que hay que hacer! Avísame si eso ayuda.
fuente
NSSet
por indexar. Es común utilizar dos estructuras de datos diferentes para los mismos datos. O construye e indexa en esa matriz :) Pero entonces es mejor usar una base de datos que ya lo tenga implementado.NSSet
yNSArray
, mi respuesta es precisa y completa. Sí, puede construir otras estructuras de datos, pero solo estoy comparando estos dos.NSArray
y alguna funcionalidad deNSSet
, la respuesta correcta no es "utilizarNSArray
y sacrificar el rendimiento". La respuesta es combinar ambos o utilizar una estructura de datos diferente.NSOrderedSet está disponible en iOS 5+, por lo que la principal diferencia es si desea objetos duplicados en la estructura de datos.
fuente
NSArray :
NSSet :
fuente
Una matriz se utiliza para acceder a elementos por su índice. Cualquier elemento se puede insertar en la matriz varias veces. Las matrices mantienen el orden de sus elementos.
Un conjunto se usa básicamente solo para verificar si el artículo está en la colección o no. Los artículos no tienen concepto de orden ni indexación. No puede tener un artículo en un conjunto dos veces.
Si una matriz quiere verificar si contiene un elemento, tiene que verificar todos sus elementos. Los conjuntos están diseñados para utilizar algoritmos más rápidos.
Puedes imaginar un conjunto como un diccionario sin valores.
Tenga en cuenta que la matriz y el conjunto no son las únicas estructuras de datos. Hay otros, por ejemplo, Cola, Pila, Montón, Montón de Fibonacci. Recomendaría leer un libro sobre algoritmos y estructuras de datos.
Consulte wikipedia para obtener más información.
fuente
contains
operación esO(n)
. El número de comparaciones cuando no está en la matriz esn
. El número medio de comparaciones cuando el objeto está en la matriz esn/2
. Incluso si se encuentra el objeto, el rendimiento es terrible.NSArray
s tienen otras ventajas de velocidad sobreNSSet
s. Como siempre, es una compensación.la matriz
el conjunto
fuente
Las principales diferencias ya se han dado en otras respuestas.
Solo me gustaría señalar que debido a la forma en que se implementan los conjuntos y diccionarios (es decir, usando hashes), uno debe tener cuidado de no usar objetos mutables para las claves.
Si una clave está mutada, el hash (probablemente) también cambiará, apuntando a un índice / depósito diferente en la tabla hash. El valor original no se eliminará y, de hecho, se tendrá en cuenta al enumerar o preguntar a la estructura su tamaño / recuento.
Esto puede provocar algunos errores realmente difíciles de localizar.
fuente
Aquí puede encontrar una comparación bastante completa de las estructuras de datos
NSArray
yNSSet
.Breves conclusiones:
fuente
Por lo general, usaría un Conjunto cuando la velocidad de acceso es esencial y el orden no importa , o está determinado por otros medios (a través de un predicado o descriptor de clasificación). Core Data, por ejemplo, usa conjuntos cuando se accede a los objetos administrados a través de una relación a muchos
fuente
Solo para agregar un poco, uso el conjunto a veces solo para eliminar duplicados de la matriz como: -
fuente