当前位置: 代码迷 >> 综合 >> 【IOS 开发学习总结-OC-30】★★OC之foundation 框架——集合(NSSet 与 NSMutableSet)
  详细解决方案

【IOS 开发学习总结-OC-30】★★OC之foundation 框架——集合(NSSet 与 NSMutableSet)

热度:71   发布时间:2024-01-19 01:32:55.0

有关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集合中元素个数为3NSLog(@"set1集合中元素个数为%ld" , [set1 count]);NSLog(@"s1集合:%@" , NSCollectionToString(set1));NSSet* set2 = [NSSet setWithObjects:@"孙悟空" , @"疯狂Android讲义",@"猪八戒" , nil];NSLog(@"s2集合:%@" , NSCollectionToString(set2));// 向set1集合中添加单个元素,将添加元素后生成的新集合赋给set1set1 = [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.
  相关解决方案