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

有关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.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值