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文档。 

时间: 2024-09-21 20:47:52

Object C学习笔记12-集合的相关文章

Object C学习笔记17-动态判断和选择器

当时学习Object C的时被人鄙视了一顿,说使用.NET的思想来学Object C就是狗屎:不过也挺感谢这位仁兄的,这让我学习的时候更加的谨慎.今天的学习笔记主要记录Object C中的动态类型相关内容. 首先还是和.NET先对比一下,.NET中存在一个关键字var ,这个估计用过.NET的都知道,除非没有接触过3.0以上版本的.在.NET中能够使用var来声明任何类型的局部变量,负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量.但是这里要注意的时var 并不是一

Object C学习笔记10-静态方法和静态属性

在.NET中我们静态使用的关键字static有着举足轻重的作用,static 方法可以不用实例化类实例就可以直接调用,static 属性也是如此.在Object C中也存在static关键字,今天的学习过程使用到了这个关键字,在这里记录一下static的使用. 在Object C的语法中声明后的static静态变量在其他类中是不能通过类名直接访问的,它的作用域只能是在声明的这个.m文件中 .不过可以调用这个类的方法间接的修改这个静态变量的值.对于Object C中的类使用和定义在前面已经做过相应

Object C学习笔记21-typedef用法

在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作用是给一个数据类型定义一个新的名称,这些类型报告内部数据类型,比如int,char 还有自定义类型struct,enum等. typedef一般有两个作用:(1) 给某种类型顶一个定义比较容易记的名字,相当于别名;(2)简化较为复杂的类型声明.   二. typedef的使用 1. 定义新类型 语法

Object C学习笔记15-协议(protocol)

在.NET中有接口的概念,接口主要用于定义规范,定义一个接口关键字使用interface.而在Object C 中@interface是用于定义一个类的,这个和.NET中有点差别.在Object C中有一个协议(protocol) 的概念,这个和.NET中的interface类似. 协议(Protocol) 在列出的方法在本类中并没有相应实现,而是别的类来实现这些方法,而定义协议必须使用protocol关键字.   一. 如何定义protocol的定义 如何使用XCode新建一个协议.h 文件

API Demos 2.3 学习笔记 (12)-- Views->Rating Bar

更多精彩内容,请点击阅读:<API Demos 2.3 学习笔记> RatingBar是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定.用户可以通过触屏点击或者轨迹球左右移动来进行星型等级评定.RatingBar有三种风格:ratingBarStyle 默认风格  ratingBarStyleSmall 小风格 ratingBarStyleIndicator 大风格 其中,默认风格的RatingBar是我们通常使用的可以交互的,而后面两种不能进行进行交互,只能作为指示牌

Object C学习笔记8-字符串NSString之二

5. 字符串是否包含 hasPrefix 判断字符串是否以某个字符串开头 hasSuffix 判断字符串是否以某个字符串结尾 NSString *str1=@"Object C学习正在进行中.... LOVE"; if([str1 hasPrefix:@"Object"]){ NSLog(@"字符串:%@是以%@开头",str1,@"Object"); } if([str1 hasSuffix:@"LOVE"

Object C学习笔记6-如何在Windows环境搭建Object C开发环境

1. 安装编译环境 Object C和其他很多语言一样,都需要有一个编译器.Object C 是在GCC下编译的.GCC(GNU Compiler Collection,GNU编译器集合),是一套由 GNU 开发的编程语言编译器.很多人想到学习Object C就想到mac电脑,想到XCode开发工具.其实在Windows环境一下也可以编译Object C. 首先下载Windows版本的GCC编译器,下载地址:http://wwwmain.gnustep.org/resources/downloa

Object C学习笔记9-字符串NSMutableString

  NSMutableString类继承自NSString,所以在NSString中的方法在NSMutableString都可以使用. NSMutableString和NSString的区别在于NSMutableString是动态的字符串,可以动态的添加,修改,删除等.在前面提到了就和.NET中的string和StringBuilder的区别一样.   1. 添加字符串 向字符串末尾添加字符串可以使用appendString方法和appendFormat方法.appendString方法主要用于

Object C学习笔记13-Dictionary字典

通过Array数组和Set集合的学习和理解,可以想象得到Dictionary也分为两种情况了,那就是可变和不可变两种类型的.的确如此,在Object C中提供了两个字典类,分别为NSDictionary 和 NSMutableDictionary. 在.NET中我们也学习过Dictionary类,这个集合的存储方式是键值对的方式存储的.而且使用Dictionary查找元素也极为简单.   一 NSDictionary 不可变字典 (1) 初始化字典 NSDictionary *dic=[NSDi

Object C学习笔记11-数组

  在Object C也提供了类似C#中的Array数组对象,在Object C中使用NSArray 来创建数组:但是在Object C中NSArray 只能存放对象类型的指针,不能存放int,char,double等基本数据类型. 一. 不可变数组对象 这个和之前的NSString有些类似,NSArray 能够创建不可变的数组对象.一旦初始化这个对象就不能动态的修改和增加这个数组. (1)使用arrayWithObjects来初始化数组内容,参考如下代码: NSArray *items=[NS