• Object C学习笔记12-集合


      这里讲到的集合是指Set集合,其实Array也是一种类型的集合。在Object C中提供了两个集合类NSSet和NSMutableSet。其实NSSet和NSArray性质一样,都是用于存储对象的。

      然而Array集合和Set集合还是有区别的,主要是在于Set集合的搜索速度要比Array速度要快,NSArray和NSMutableArray 是一种有序集合,其存储的值在内存中是连续的,而NSSet和NSMutableSet是无需集合,在内存中的存储方式是不连续的,在NSSet,NSMutableSet采用了hash算法,你懂的!

      

      一. NSSet集合

        刚才上面也简单的介绍了一下NSSet集合,NSSet集合是一种无序集合,使用hash算法来查找存储的值。通过hash算法可以直接查找到存储的地址,而有序集合需要遍历所有元素来查找数据。

        (1) 初始化NSSet集合

    NSNumber *num=[NSNumber numberWithInteger:2345];
    NSSet *set=[NSSet setWithObjects:@"abc",@"efg", num,nil];

        因为NSSet集合只能存储对象类型,如果要存储int,char,double 等基础类型,必须将这些转化为对象类型才能存储到NSSet集合中。第一行代码将数字转化为NSNumber数字对象。

        使用setWithObjects 来初始化一个NSSet集合,同样和NSArray一样,需要使用nil来标识集合的结束。

        (2) 使用count获取NSSet集合的长度

    NSNumber *num=[NSNumber numberWithInteger:2345];
            NSSet *set=[NSSet setWithObjects:@"abc",@"efg", num,nil];
            NSLog(@"%d",[set count]);

        上面的代码输出结果为3,说明集合set中包含三个元素,注意最后的nil不包含在其中。同时NSSet可以同时存储不同类型的对象,上面的代码中就包含了NSString和NSNumber两种类型对象。

        (3) 使用containObject判断是否包含某个元素

    NSNumber *num1=[NSNumber numberWithInteger:23];
    bool flag=[set containsObject:num1];
    NSLog(@"%i",flag);

        这段代码中重新声明了一个对象num1,containObject方法用于判断NSSet中是否包含特定的对象,返回值为bool。如果使用如上代码则则返回为NO,输出为0

         (4) 使用objectEnumerator将集合转化为迭代器

    NSEnumerator *enumr=[set objectEnumerator];
            NSObject *item=[enumr nextObject];
            while(item!=nil){
                NSLog(@"%@",item);
                item=[enumr nextObject];
            }
            
            for(NSObject *obj in set){
                NSLog(@"%@",obj);
            }

        使用set调用objectEnumerator方法只会,就将集合转化为NSEnumerator类,而NSEnumerator类有一个很重要的方法nextObject,用于获取迭代器的下一个元素。直到迭代到最后一个元素。

        (5) 元素的比较

    //比较两个集合
            NSSet *setItems1=[NSSet setWithObjects:@"123", @"234", @"456",nil];
            NSSet *setItem2=[NSSet setWithObjects:@"123",@"234", nil];
            NSSet *setItem3=[NSSet setWithObjects:@"123",@"234", @"456",nil];
            
            bool flag1=[setItems1 isEqualToSet:setItem2];
            bool flag2=[setItems1 isEqualToSet:setItem3];
            NSLog(@"flag1=%i",flag1);
            NSLog(@"flag2=%i",flag2);
            
            bool flag3=[setItem2 isSubsetOfSet:setItems1];
            NSLog(@"flag3=%i",flag3);
            
            bool flag5=[setItems1 isSubsetOfSet:setItem2];
            NSLog(@"flag5=%i",flag5);
            
            bool flag4=[setItem2 intersectsSet:setItem3];
            NSLog(@"flag4=%i",flag4);
    集合的比较例子

        使用方法isEqualToSet用于判断两个集合元素是否一样,返回bool值。

        - (BOOL)isSubsetOfSet:(NSSet *)otherSet; 判断前者集合是不是后者的子集。在上面的例子中可以看到两个集合调用的主从关系,这里是有区别的。

        - (BOOL)intersectsSet:(NSSet *)otherSet;判断两个集合是否有交集,也就是两个集合是否有相同的元素。

      二. NSMutableSet动态集合

        NSMutableSet和之前的NSMutableArray数组一样,是可以动态添加和删除元素的。NSMutableSet是NSSet的一个子类。

        (1) setWithCapacity用于初始化NSMutableSet的容量,这里要注意容量并不等于存储的元素数量

    NSMutableSet *muSet=[NSMutableSet setWithCapacity:10];

        以上代码就是初始化了一个容量为10的NSMutableSet集合,当往NSMutableSet中添加新的元素对象时候,如果数量超过10不会数组越界,因为NSMutableSet是当存储满之后容量自动扩充。

        (2) 往集合中添加对象元素

    NSMutableSet *muSet=[NSMutableSet setWithCapacity:10];
            
            NSNumber *number1=[NSNumber numberWithInteger:344];
            NSNumber *number2=[NSNumber numberWithInt:34];
            NSNumber *number3=[NSNumber numberWithInt:545];
            [muSet addObject:number1];
            [muSet addObject:number2];
            [muSet addObject:number3];
            
            NSArray *nsArray=[NSArray arrayWithObjects: [NSNumber numberWithInt:2],[NSNumber numberWithInt:3],[NSNumber numberWithInt:4], nil];
            [muSet addObjectsFromArray:nsArray];
            
            for(NSNumber *item in muSet){
                NSLog(@"^^^^^^%d",item);
            }
    集合NSMutableSet中添加元素

        addObject 方法用于往NSMutableSet集合中添加元素,每次只能添加一个元素。

        而addObjectsFromArray方法则用于将一个数组添加到NSMutableSet集合中

        (3) 删除集合中的元素

    [muSet removeObject:[NSNumber numberWithInt:2]];
            for(NSNumber *item in muSet){
                NSLog(@"-----^%d",item);
            }
            [muSet removeAllObjects];
            int leng=[muSet count];
            NSLog(@"00000-%d",leng);
    删除NSMutableSet集合中的元素

        使用removeObject方法用于删除NSMutableSet集合中的元素,在以上代码中删除一个值为2的NSNumber对象。

        而使用removeAllObjects方法则用于删除NSNutableSet中的所有的元素,最后一行代码输出的结果0。

        (4)其他方法介绍

        - (void)unionSet:(NSSet *)other;用于向集合中添加另外一个集合的所有元素

        - (void)minusSet:(NSSet *)other;用于删除other中包含的元素

        

      Set集合与Array比较类似,更多方法可以查看官方API文档。 

  • 相关阅读:
    洛谷 P1057 传球游戏
    BZOJ 1801: [Ahoi2009]chess 中国象棋
    BZOJ 1806: [Ioi2007]Miners 矿工配餐
    51nod 1276 岛屿的数量
    BZOJ 1800: [Ahoi2009]fly 飞行棋
    路由控制和视图层
    django的零碎注意点
    Django框架简介
    Bootstrap框架
    jQuery基础知识
  • 原文地址:https://www.cnblogs.com/qingyuan/p/3587342.html
Copyright © 2020-2023  润新知