什么时候在NSArray上使用NSSet更好?

gem*_*der 111 arrays cocoa cocoa-touch objective-c ios

我在我的应用程序中多次使用NSSets,但我自己从未创建过.

何时更好地使用a NSSet而不是NSArray为什么?

Jam*_*ter 178

Apple的文档中的图像描述得非常好:

Objective-C集合

Array是一个有序的(在添加时维护订单)元素序列

[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]
Run Code Online (Sandbox Code Playgroud)

Set是一个独特的(没有重复的),无序的元素列表

[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]
Run Code Online (Sandbox Code Playgroud)

  • 感谢您编辑@Zaheer,但实际上它无效.我没有添加原语.我正在添加文字. (9认同)
  • 在您的示例中,您将向数组和集添加基元.两者都不可能,因为它们只能包含对象. (2认同)

Ole*_*ann 167

当集合中的项目顺序不重要时,集合可以更好地查找集合中的项目.

原因是一个集合使用哈希值来查找项目(如字典),而数组必须迭代其整个内容以查找特定对象.

  • @ rohan-patel正确是O(1)vs O(n) (23认同)
  • log(1)vs log(n) (9认同)

woz*_*woz 65

最好的答案是这是Apple自己的文档.

在此输入图像描述

主要区别在于NSArray有序集合,NSSet适用于无序集合.

有几篇文章讨论了两者之间的速度差异,就像这一篇.如果您正在迭代无序集合,那就NSSet太棒了.但是,在许多情况下,你需要做一些只能做的事情NSArray,所以你牺牲了这些能力的速度.

的NSSet

  • 主要通过比较访问项目
  • 无序
  • 不允许重复

NSArray的

  • 可以按索引访问项目
  • 有序
  • 允许重复

这就是真的!如果有帮助,请告诉我.


Jas*_*son 12

NSOrderedSet在iOS 5+中可用,因此主要区别在于您是否需要数据结构中的重复对象.


iOS*_*fee 9

NSArray:

  1. 有序的数据收集
  2. 允许重复
  3. 它是集合类型对象

NSSet:

  1. 无序的数据收集
  2. 不允许重复
  3. 它也是集合类型对象


Sul*_*han 7

数组用于按索引访问项目.任何项目都可以多次插入到数组中.数组保持元素的顺序.

集合基本上仅用于检查项目是否在集合中.这些项目没有订单或索引的概念.您不能在套装中放置两次物品.

如果数组想要检查它是否包含元素,则必须检查其所有项.集合旨在使用更快的算法.

您可以想象一个没有值的字典集.

请注意,数组和集不是唯一的数据结构.还有其他,例如Queue,Stack,Heap,Fibonacci's Heap.我建议你读一本关于算法和数据结构的书.

有关更多信息,请参阅维基百科.


小智 5

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);
Run Code Online (Sandbox Code Playgroud)

数组

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

集合

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