有关NSSet的概述介绍参见前面的一篇博文: 【IOS 开发学习总结-OC-28】★objective-c之foundation 框架——集合类的综述
NSSet的功能和用法
NSSet按 Hash 算法 来存储集合中的元素,因此具有很好的存取 和查找性能。
它与 数组NSArray 最大的不同是:元素没有索引。除此之外,它们有大量相似之处,它们在如下方面的调用机制都很 相似。
1. 都可通过 count 方法获取集合元素的数量。
2. 都可通过快速枚举来遍历集合元素。
3. 都提供了集合的所有的元素和部分元素进行 KVO 编程的方法。
4. 都提供了valueForKey:
和 setValue:forKey:
方法对集合元素整体进行 KVC 编程 。
5. 通过 objectEnumerator方法获取NSEnumerator枚举器对集合元素进行遍历。对 NSSet 提供反向迭代器没有意义——NSSet 集合本身就是无序的。
6. 都提供了makeObjectsPerformSelector:
和makeObjectsPerformSelector:withObject:
方法对集合元素整体调用某个方法,以及enumerateObjectsUsingBlock:
和enumerateObjectsWithOptions:usingBlock:
对集合整体或部分元素迭代执行代码块。
NSSet的基本用法
NSSet同样提供了类方法和实例方法来初始化NSSet集合,其中,以 set 开头的为类方法,以 init 开头的方法为实例方法。
NSSet常用的方法:
1. setByAddingObject:
向集合中添加一个新元素 ,返回添加元素后的新集合。
2. setByAddingObjectsFromSet:
使用NSSet集合向集合中添加多个元素,返回添加元素后的新集合。
3. setByAddingObjectsFromArray:
使用 NSArray 集合向集合添加多个新元素,返回添加元素后的新集合。
4. allObjects:
返回该集合中所有元素组成的 NSArray.
5. anyObject:
返回该集合中的某个元素。——该方法返回的元素是不确定的,但该方法并不保证随机返回集合元素。
说明:
6. containsObject:
判断集合是否包含指定元素
7. member:
判断该集合是否包含与 该参数相等的元素。——如果包含,返回相等的元素,否则返nil.
8. objectsPassingTest:
需要传入一个代码块对集合元素进行过滤,满足该代码块 条件的集合元素被保留下来并组成一个新的 NSSet 集合作为返回值。
9. objectsWithOptions:PassingTest:
与前一方法类似,只是额外地传入一个 NSEnumerationOptions 迭代选项参数。
10. isSubsetOfSet:
判断当前集合是否为另一个集合的子集。
11. intersectsSet:
判断2个集合的元素是否有 相同的元素。——是否有交集。
12. isEqualSet:
判断2个集合的元素是否相等。
示例程序:
#import <Foundation/Foundation.h>
// 定义一个函数,该函数可把NSArray或NSSet集合转换为字符串
NSString* NSCollectionToString(id collection)
{
NSMutableString* result = [NSMutableString
stringWithString:@"["];
// 使用快速枚举遍历NSSet集合
for(id obj in collection)
{
[result appendString:[obj description]];
[result appendString:@", "];
}
// 获取字符串长度
NSUInteger len = [result length];
// 去掉字符串最后的两个字符
[result deleteCharactersInRange:NSMakeRange(len - 2, 2)];
[result appendString:@"]"];
return result;
}
int main(int argc , char * argv[])
{
@autoreleasepool{
// 用4个元素初始化NSSet集合,
// 故意传入两个相等的元素, NSSet集合只会保留一个元素
NSSet* set1 = [NSSet setWithObjects:
@"疯狂iOS讲义" , @"疯狂Android讲义",
@"疯狂Ajax讲义" ,@"疯狂iOS讲义" , nil];
// 程序输出set1集合中元素个数为3
NSLog(@"set1集合中元素个数为%ld" , [set1 count]);
NSLog(@"s1集合:%@" , NSCollectionToString(set1));
NSSet* set2 = [NSSet setWithObjects:
@"孙悟空" , @"疯狂Android讲义",
@"猪八戒" , nil];
NSLog(@"s2集合:%@" , NSCollectionToString(set2));
// 向set1集合中添加单个元素,将添加元素后生成的新集合赋给set1
set1 = [set1 setByAddingObject:@"Struts 2.1权威指南"];
NSLog(@"添加一个元素后:%@" , NSCollectionToString(set1));
// 使用NSSet集合向set1集合中添加多个元素,相当计算两个集合的并集
NSSet* s = [set1 setByAddingObjectsFromSet:set2];
NSLog(@"set1与set2的并集:%@" , NSCollectionToString(s));
// 计算两个NSSet集合的是否有交集
BOOL b = [set1 intersectsSet:set2];
NSLog(@"set1与set2是否有交集:%d" , b);// 将输出代表YES的1
// 判断set2是否是set1的子集
BOOL bo = [set2 isSubsetOfSet:set1];
NSLog(@"set2是否为set1的子集:%d" , bo);// 将输出代表NO的0
// 判断NSSet集合是否包含指定元素
BOOL bb = [set1 containsObject:@"疯狂Ajax讲义"];
NSLog(@"set1是否包含\"疯狂Ajax讲义\":%d" , bb);// 将输出代表YES的1
// 下面两行代码将取出相同的元素,但取出哪个元素是不确定的。
NSLog(@"set1取出一个元素:%@"
, [set1 anyObject]);
NSLog(@"set1取出一个元素:%@"
, [set1 anyObject]);
// 使用代码块对集合元素进行过滤
NSSet* filteredSet = [set1 objectsPassingTest:
^(id obj, BOOL *stop)
{
return (BOOL)([obj length] > 8);
}];
NSLog(@"set1中元素的长度大于8的集合元素有:%@"
, NSCollectionToString(filteredSet));
}
}
编译运行结果:
2015-10-03 19:44:53.100 923[2729:148826] set1集合中元素个数为3
2015-10-03 19:44:53.