这里讲到的集合是指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:@"", @"", @"",nil];
NSSet *setItem2=[NSSet setWithObjects:@"",@"", nil];
NSSet *setItem3=[NSSet setWithObjects:@"",@"", @"",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:];

NSNumber *number1=[NSNumber numberWithInteger:];
NSNumber *number2=[NSNumber numberWithInt:];
NSNumber *number3=[NSNumber numberWithInt:];
[muSet addObject:number1];
[muSet addObject:number2];
[muSet addObject:number3]; NSArray *nsArray=[NSArray arrayWithObjects: [NSNumber numberWithInt:],[NSNumber numberWithInt:],[NSNumber numberWithInt:], nil];
[muSet addObjectsFromArray:nsArray]; for(NSNumber *item in muSet){
NSLog(@"^^^^^^%d",item);
}

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

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

(3) 删除集合中的元素

[muSet removeObject:[NSNumber numberWithInt:]];
for(NSNumber *item in muSet){
NSLog(@"-----^%d",item);
}
[muSet removeAllObjects];
int leng=[muSet count];
NSLog(@"00000-%d",leng);

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

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

(4)其他方法介绍

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

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

    

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

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

  1. Ext.Net学习笔记12:Ext.Net GridPanel Filter用法

    Ext.Net学习笔记12:Ext.Net GridPanel Filter用法 Ext.Net GridPanel的用法在上一篇中已经介绍过,这篇笔记讲介绍Filter的用法. Filter是用来过 ...

  2. Java学习笔记之---集合

    Java学习笔记之---集合 (一)集合框架的体系结构 (二)List(列表) (1)特性 1.List中的元素是有序并且可以重复的,成为序列 2.List可以精确的控制每个元素的插入位置,并且可以删 ...

  3. Object C学习笔记24-关键字总结

    学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1.  #import #import <> 从syste ...

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

    当时学习Object C的时被人鄙视了一顿,说使用.NET的思想来学Object C就是狗屎:不过也挺感谢这位仁兄的,这让我学习的时候更加的谨慎.今天的学习笔记主要记录Object C中的动态类型相关 ...

  5. Object C学习笔记24-关键字总结(转)

    学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1.  #import #import <> 从syste ...

  6. SpringMVC:学习笔记(12)——ThreadLocal实现会话共享

    SpringMVC:学习笔记(12)——ThreadLocal实现会话共享 ThreadLocal ThreadLocal,被称为线程局部变量.在并发编程的情况下,使用ThreadLocal创建的变量 ...

  7. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...

  8. 软件测试之loadrunner学习笔记-02集合点

    loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...

  9. Object C学习笔记22-#define 用法

    上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 .而在c中还有另外一个很重要的关键字#define. 一. #define 简介 在C中利用预 ...

  10. Object C学习笔记21-typedef用法

    在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作 ...

随机推荐

  1. vue.js高仿饿了么(前期整理)

    1.熟悉项目开发流程 需求分析——>脚手架工具——>数据mock——>架构设计——>代码编写——>自测——>编译打包. 2.熟悉代码规范 从架构设计.组件抽象.模块 ...

  2. WEB API 支持多种端的后台

    一套代码,支持多种平台 1. 支持web 可以js获取webapi的数据源.利用mvvm组织展现在html上. 2.支持安卓. post方法,安卓获取webapi的数据.

  3. 使用 PowerShell 创建和修改 ExpressRoute 线路

    开始之前 安装最新版本的 Azure Resource Manager PowerShell cmdlet. 有关详细信息,请参阅 Azure PowerShell 概述. 在开始配置之前,请查看先决 ...

  4. Oracle EBS AR 事务处理到期余额总计API

    declare    -- Local variables here   i integer;   x_line_original NUMBER;   x_line_remaining NUMBER; ...

  5. springMVC入门-09

    这一节介绍SpringMVC对文件上传的支持,该功能支持需要使用到两个jar包:cmmons-fileupload-1.2.2.jar和commons-io-2.1.jar. 在controller类 ...

  6. 转:JavaBean 、 Serverlet 总结

    Serverlet简介: Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web ...

  7. 引用js文件

    在子模板里引用js文件的时候,需要把相应的.js文件放到static目录下,如引用static/jQuery/index.js文件: {% extends "base.html" ...

  8. 关于cocos2dx的textfield事件响应

    time:2015/08/27 1. textfiled cocostudio的输入框,看源代码知道他是直接继承widget的,但是真正的输入框功能是label实现的,是Textfield类的一个成员 ...

  9. [沫沫金]JavaWeb企业信息系统,增加操作记录、数据库记录

    背景 系统出现数据莫名丢失,业务人员的反馈无法复现问题.纠结了很久,最终老板发话要记录操作,通过日志进行分析重现 环境 SSH框架 目标 1.记录访问了那个方法,使用的参数及返回的内容 2.记录新增. ...

  10. 基于springMVC的RESTful服务实现

    一,什么是RESTful RESTful(RESTful Web Services)一种架构风格,表述性状态转移,它不是一个软件,也不是一个标准,而是一种思想,不依赖于任何通信协议,但是开发时要成功映 ...