集合(容器)
容器用于装东西、取东西、遍历、删除东西……
NSArray和NSMutableArray
NSArray模仿了数组,因此代表了集合元素是有顺序、有索引(可根据位置来获取)的容器。
NSArray允许元素重复!!!
创建数组
A. 用NSArray的initWithXxx:方法或arrayWithXxx:类方法。
B. 简化语法。
查询该容器
- 是否包含指定对象。
- 获取第一个、最后一个、指定位置的元素(即可用方法,也可下标)
对容器中查找对象
-(NSUInteger)indexOfObject:(id)anObject:获取指定对象的索引。
-(NSUInteger)indexOfObjectPassingTest: 代码块。 获取该数组中符合代码块条件的元素的索引。
对集合中所有元素挨个地调用方法
这些方法都包含了隐式的遍历(不需要程序员写循环,但实际上有循环)
[arrmakeObjectsPerformSelector:@selector(方法)]: 让arr数组中所有元素执行指定方法。
-(void)enumerateObjectsAtIndexes:(NSIndexSet *)indexSet
options:(NSEnumerationOptions)opts
usingBlock:(void (^)(idobj,
NSUInteger idx,
BOOL*stop))block :让让arr数组中某些元素执行指定代码块。
得到一个新数组
- (NSArray*)arrayByAddingObject:(id)anObject:通过添加新对象来得到新数组。
- (NSArray*)filteredArrayUsingPredicate:(NSPredicate *)predicate :通过过滤来得到新数组。
- (NSArray*)subarrayWithRange:(NSRange)range: :只要中间某一段的元素,从而得到新的数组。
排序
- (NSArray*)sortedArrayUsingFunction:(NSInteger (*)(id,
id,
void *))comparator
context:(void*)context: 用代码块排序。
- (NSArray*)sortedArrayUsingSelector:(SEL)comparator:根据数组元素的某个方法来排序,要求数组元素能比较大小才行。、
- (NSArray*)sortedArrayWithOptions:(NSSortOptions)opts
usingComparator:(NSComparator)cmptr: :根据代码块排序
写入文件、读取文件
+ (NSArray*)arrayWithContentsOfFile:(NSString *)aPath : 被读的文件必须符合NSArray要求格式的文件。
- (BOOL)writeToFile:(NSString *)path
atomically:(BOOL)flag :写入文件。
对集合元素进行整体kvc和kvo(也是挨个地、依次地处理每个元素)
setValue: forKey: - 该方法包含了隐式的循环,通过循环依次对每个元素都执行KVC的setter
valueForKey: - 该方法包含了隐式的循环,通过循环依次对每个元素都执行KVC的getter
快速枚举
for(ele in 集合)
{
}
NSMutableArray
NSArray的特征是:不可变的。体现为:一旦NSArray创建出来,它原来包含多少个元素,以后永远都包含这些元素。
元素的个数不能发生改变,也不能添加、删除、修改元素(不能替换元素,元素本身可以被修改的)。
NSMutableArray:可变的。体现为:容器可以添加元素、删除元素、替换元素、改变元素顺序。
替换元素时,支持使用下标方式进行替换。
NSSet和NSMutableSet
NSSet与NSArray区别是:NSSet中元素是无序(不保证元素的添加顺序),也没有索引。因此程序不能根据索引来访问、插入、替换元素。
基本上,只要NSArray中涉及到索引相关的方法,NSSet都不能用;反之,不涉及索引的方法,NSSet几乎都可以使用。
因此NSSet不允许元素重复!!!
创建Set
只能通过初始化方法(类方法)来创建。包括创建空的Set、包含一个对象的Set、包含多个对象的Set。
查询该容器
- 是否包含指定对象。
- (id)anyObject: 获取容器中某个元素,到底获取哪个元素是不确定的。但又不是随机的。
理解这个方法:当我们把多个元素存入NSSet中,多个元素在NSSet中顺序对程序员是透明的——除非你打印该Set,否则你不知道元素的保存顺序。而anyObject方法总是返回NSSet集合的第一个元素。
对集合中所有元素挨个地调用方法
这些方法都包含了隐式的遍历(不需要程序员写循环,但实际上有循环)
[arrmakeObjectsPerformSelector:@selector(方法)]: 让arr数组中所有元素执行指定方法。
-(void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts
usingBlock:(void (^)(id obj,
BOOL *stop))block :让set中所有元素执行指定代码块。
得到一个新Set
- (NSSet*)setByAddingObject:(id)anObject:通过添加新对象来得到新Set。
- (NSSet*)filteredSetUsingPredicate:(NSPredicate *)predicate:通过过滤来得到新数组。
快速枚举
for(ele in 集合)
{
}
对集合元素进行整体kvc和kvo(也是挨个地、依次地处理每个元素)
setValue: forKey: - 该方法包含了隐式的循环,通过循环依次对每个元素都执行KVC的setter方法
valueForKey: - 该方法包含了隐式的循环,通过循环依次对每个元素都执行KVC的getter方法
NSMutableSet
NSSet的特征是:不可变的。体现为:一旦NSSet创建出来,它原来包含多少个元素,以后永远都包含这些元素。
元素的个数不能发生改变,也不能添加、删除、修改元素(不能替换元素,元素本身可以被修改的)。
NSMutableSet:可变的。体现为:容器可以添加元素、删除元素、替换元素。 还可以支持集合加(并)、减、交
NSCountedSet
NSCountedSet是NSMutableSet的子类,它能记住元素的添加次数。
额外增加了如下方法来获取元素的添加次数:
- (NSUInteger)countForObject:(id)anObject
当程序去删除元素时,实际上只是将该元素的添加次数减1,只有当该元素的添加此处变为0时,该元素才会被真正删除。
NSSet如何判断两个元素重复 (高级)
NSSet不允许添加重复的元素的。
- 两个元素通过isEqual:比较要返回YES。
- 两个元素的hash方法返回值也相等。
如果仅仅只满足第一条,对于NSSet可以认为两个元素是重复。换句话来说,如果两个元素仅仅只是isEqual:比较返回YES,
——只是程序在创建NSSet时会把两个元素当成同一个元素。
如果你希望NSMutableSet在添加元素时,都能认为两个元素是重复的,必须满足上面2个条件。
NSOrderedSet与NSMutableOrderedSet
NSOrderedSet既有NArray的特性(元素有顺序,有索引),也有NSSet的特性(元素不允许重复)。
它的方法,基本等同于NSArray。
NSMutableOrderedSet的方法类似NSMutableArray