¿Cuándo es mejor usar un NSSet en un NSArray?

He usado NSSets muchas veces en mis aplicaciones, pero nunca he creado una.

Mi pregunta es:

¿Cuándo es mejor usar un NSSet en lugar de un NSArray y por qué?

Cuando el order de los artículos en la colección no es importante, los sets ofrecen un mejor performance para encontrar artículos en la colección.

La razón es que un set utiliza valores hash para encontrar elementos (como un dictionary) mientras que una matriz tiene que iterar sobre todo su contenido para encontrar un object en particular.

La image de la Documentación de Apple lo describe muy bien:

Colecciones Objective-C

Array es orderada (la order se mantiene cuando agrega) secuencia de elementos

 [array addObject:@1]; [array addObject:@2]; [array addObject:@3]; [array addObject:@4]; [array addObject:@6]; [array addObject:@4]; [array addObject:@1]; [array addObject:@2]; [1, 2, 3, 4, 6, 4, 1, 2] 

Set es una list de elementos distinta (sin duplicates) y desorderada

 [set addObject:@1]; [set addObject:@2]; [set addObject:@3]; [set addObject:@4]; [set addObject:@6]; [set addObject:@4]; [set addObject:@1]; [set addObject:@2]; [1, 2, 6, 4, 3] 

La mejor respuesta es que esta es la documentation de Apple .

introduzca la descripción de la imagen aquí

La principal diferencia es que NSArray es para una colección orderada y NSSet es para una colección desorderada.

Hay varios artículos por ahí que hablan sobre la diferencia de velocidad entre los dos, como este . Si está recorriendo una colección desorderada, NSSet es genial. Sin embargo, en muchos casos, debe hacer cosas que solo un NSArray puede hacer, por lo que sacrifica la velocidad de esas habilidades.

NSSet

  • Principalmente acceder a los elementos por comparación
  • Desorderado
  • No permite duplicates.

NSArray

  • Puede acceder a los elementos por índice
  • Ordenado
  • Permite duplicates

¡Eso es todo lo que realmente hay para eso! Avísame si eso ayuda.

NSOrdenetworkingSet está disponible en iOS 5+, por lo que la diferencia principal es si desea objects duplicates en la estructura de datos.

NSArray :

  1. Recogida orderada de datos
  2. Permite duplicates
  3. Es object del tipo de colección

NSSet :

  1. Recostackción desorderada de datos
  2. No permite duplicates.
  3. También es object del tipo de colección

Una matriz se usa para acceder a los elementos por su índice. Cualquier elemento se puede insert en la matriz varias veces. Los arreglos mantienen el order de sus elementos.

Un set se usa básicamente solo para verificar si el artículo está en la colección o no. Los elementos no tienen concepto de order o indexing. No puede tener un artículo en un juego dos veces.

Si una matriz quiere verificar si contiene un elemento, tiene que verificar todos sus elementos. Los sets están diseñados para usar algorithms más rápidos.

Puedes imaginar un set como un dictionary sin valores.

Tenga en count que la matriz y el set no son las únicas estructuras de datos. Hay otros, por ejemplo, Queue, Stack, Heap, Fibonacci's Heap. Recomendaría leer un libro sobre algorithms y estructuras de datos.

Ver wikipedia para más información.

Las principales diferencias ya se han dado en otras respuestas.

Me gustaría señalar que debido a la forma en que se implementan sets y dictionarys (es decir, usando hashes), se debe tener cuidado de no usar objects mutables para las keys.

Si una key está mutada, el hash (probablemente) cambiará también, apuntando a un índice / cubo diferente en la tabla hash. El valor original no se eliminará y, en realidad, se tendrá en count al enumerar o pedir a la estructura su tamaño / conteo.

Esto puede llevar a algunos errores realmente difíciles de localizar.

 NSArray *Arr; NSSet *Nset; Arr=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"2",@"1", nil]; Nset=[NSSet setWithObjects:@"1",@"2",@"3",@"3",@"5",@"5", nil]; NSLog(@"%@",Arr); NSLog(@"%@",Nset); 

la matriz

2015-12-04 11: 05: 40.935 [598: 15730] (1, 2, 3, 4, 2, 1)

el set

2015-12-04 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}

Aquí puede encontrar una comparación bastante completa de las NSSet datos NSArray y NSSet.

Conclusiones breves:

Sí, NSArray es más rápido que NSSet simplemente para retener e iterar. Tan solo un 50% más rápido para la construcción y hasta un 500% más rápido para la iteración. Lección: si solo necesitas iterar contenidos, no uses un NSSet.

Por supuesto, si necesita probar para la inclusión, trabaje duro para evitar NSArray. Incluso si necesita testings de inclusión y de iteración, probablemente deba elegir un NSSet. Si necesita mantener orderada su colección y también probar su inclusión, entonces debería considerar mantener dos collections (una NSArray y una NSSet), cada una con los mismos objects.

NSDictionary es más lento de build que NSMapTable, ya que necesita copyr los datos key. Compensa esto al ser más rápido a la búsqueda. Por supuesto, los dos tienen diferentes capacidades por lo que la mayoría de las veces, esta determinación debe hacerse sobre otros factores.

Normalmente, usaría un set cuando la velocidad de acceso es esencial y el order no importa, o está determinado por otros medios (a través de un pnetworkingicado o descriptor de sorting). Core Data, por ejemplo, usa sets cuando se accede a los objects gestionados a través de una relación de muchos