集合三大特性
- 确定性
- 互异性
- 无序性
集合运算
集合运算包括子集,叛等,交集,并集,补集,密集,在编程语言中仍然提供关于这些集合运算的数学方法
在iOS 中集合的编程模型对应NSSet 这个类,与数学理论保持一致,但对于编程语言来说,无法在编译时就确定元素是否有互异性,因此可以添加相同的元素,但内部添加相同的元素仅会保持一个。
NSSet *set = [NSSet setWithObjects:@1,@2,@3,@1, nil];
NSLog(@"%@",set);
打印结果
{(
3,
1,
2
)}
可以看到我们在代码中放了2个NSNumber 类型的1,但编译器不会给我们报错,并且在内部保持了集合的统一性,另外需要注意的一点是,Set是无序的,或许会发现上面的代码无论怎么运行都是这个结果,3,1,2 ,虽然每次打印的结果一致,但打印与我们代码放入的顺序无关,所以把set当做一系列没有顺序也没有索引的对象集合即可。
集合与数组有一个共同点,就是没有键值,仅仅是一个一个对象,只不过数组是有序的,而集合是无序的
集合优点:
集合灵活,并且检查元素是否存在此时比数组更快。而且对于可变的数组和集合来说,集合增删更快
适合集合的例子
假如现在正在做一个页面,这个页面是中国所有城市的列表,可以选中任意个数的城市,如果已经选中,在单击则取消选中。这样或者类似的场景比如说,购物车也是一样。
我们可能需要维护一个数组或者集合,来存放选中的城市,当用户单击某一个城市的时候,需要判断这个城市是否已经被选中,而被选中的判断来自是否是你在的数组或集合中。这个时候用数组,需要调用数组的containsObject:来判断是否存在,如果选中城市的数组量比较少还好,如果很多,甚至到几百个,在加上找到之后做增删处理,虽然处理器速度很快,但此时数组以及不如集合了。