集合  是  由若干独一无二的物件  构成的。集合  可以是  可修改的,也可以是  不可修改的。我们  可以  在集合当中  搜索  某个物件、添加  或者  去除  某个物件,我们  还可以比较  两个集合,求  两个集合的交集  或者  并集。

如果  要  在程序当中  使用  集合这类物件,那么  程序中  需要加入  下面这行语句:

1
#import <Foundation/NSSet.h>

接下来的程序  示范了  关于集合的一些基本操作。如果  你  想要  在程序执行的过程当中 多次  显示  集合的内容,那么  就需要编写  一项新的适用于NSSet这类物件的措施,叫做  print。我们  可以通过创建一个新的类别  来添加  print这项措施。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145

#import <Foundation/NSObject.h>
#import <Foundation/NSSet.h>
#import <Foundation/NSValue.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSString.h>
#define INTEGER_OBJECT(v) [NSNumber numberWithInteger:v]
@interfaceNSSet(Printing)
-(void)print;
@end
@implementationNSSet(Printing)
-(void)print
{
    printf("{");
    for(NSNumber*elementinself)
    {
        printf(" %li ",(long)[elementintegerValue]);
    }
    printf("}\n");
}
@end
intmain(intargc,constchar*argv[])
{
    NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
    NSMutableSet*setOne=[NSMutableSetsetWithObjects:INTEGER_OBJECT(1),INTEGER_OBJECT(3),INTEGER_OBJECT(5),INTEGER_OBJECT(10),nil];
    NSSet*setTwo=[NSSetsetWithObjects:INTEGER_OBJECT(-5),INTEGER_OBJECT(100),INTEGER_OBJECT(3),INTEGER_OBJECT(5),nil];
    NSSet*setThree=[NSSetsetWithObjects:INTEGER_OBJECT(12),INTEGER_OBJECT(200),INTEGER_OBJECT(3),nil];
    //将两个集合的成员显示出来
    NSLog(@"集合一:");
    [setOneprint];
    NSLog(@"集合二:");
    [setTwoprint];
    //检查两个集合是否一致
    if([setOneisEqualToSet:setTwo]==YES)
    {
        NSLog(@"集合一与集合二相等");
    }
    else
    {
        NSLog(@"集合一与集合二不相等");
    }
    //检查集合中是否包含某个成员
    if([setOnecontainsObject:INTEGER_OBJECT(10)]==YES)
    {
        NSLog(@"集合一当中包含10。");
    }
    else
    {
        NSLog(@"集合一当中不包含10.");
    }
    if([setTwocontainsObject:INTEGER_OBJECT(10)]==YES)
    {
        NSLog(@"集合二当中包含10。");
    }
    else
    {
        NSLog(@"集合二当中不包含10。");
    }
    //在集合中添加或者移除某个成员
    [setOneaddObject:INTEGER_OBJECT(4)];
    [setOneremoveObject:INTEGER_OBJECT(10)];
    NSLog(@"集合一中添加4并且去除10后是:");
    [setOneprint];
    //求两个集合的交集
    [setOneintersectSet:setTwo];
    NSLog(@"集合一与集合二的交集为:");
    [setOneprint];
    //求两个集合的并集
    [setOneunionSet:setThree];
    NSLog(@"集合一与集合三的并集为:");
    [setOneprint];
    [poolrelease];
    return0;
}

运行  这个程序  可以得到  这样的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13

2012-05-03 23:15:13.194 Sample[2760:707] 集合一:
{ 3  10  5  1 }
2012-05-03 23:15:13.196 Sample[2760:707] 集合二:
{ 3  100  -5  5 }
2012-05-03 23:15:13.197 Sample[2760:707] 集合一与集合二不相等
2012-05-03 23:15:13.197 Sample[2760:707] 集合一当中包含10。
2012-05-03 23:15:13.198 Sample[2760:707] 集合二当中不包含10。
2012-05-03 23:15:13.198 Sample[2760:707] 集合一中添加4并且去除10后是:
{ 3  5  1  4 }
2012-05-03 23:15:13.199 Sample[2760:707] 集合一与集合二的交集为:
{ 3  5 }
2012-05-03 23:15:13.199 Sample[2760:707] 集合一与集合三的并集为:
{ 3  5  12  200 }

程序中的

1
#define INTEGER_OBJECT(v) [NSNumber numberWithInteger:v]

这行语句  将  [NSNumber numberWithInteger:v]  命名为  INTEGER_OBJECT(v)。而  [NSNumber numberWithInteger:v]的作用  是  向NSNumber这类物件  发送  numberWithInteger:这条消息  从而  NSNumber这类物件  创建出  一个值为v的整数物件。所以  INTEGER_OBJECT(v)的作用  也就是  创建  一个值为v的整数物件。像  这样  给  某些语句  命名,可以少打  不少字。

1
2
3
4
5

@interfaceNSSet(Printing)
-(void)print;
@end

这几行语句  给  NSSet这类物件  创建  一个新的类别Printing。Printing这个新的类别当中  包含了  print这项措施,当然  print这项措施  是  适用于NSSet这类物件的。

在print这项措施的实施细则中  利用了  快速枚举的技巧  将  实施对象中的成员  一一  读取  到变量element当中,并且  调用  printf()函数  一一  显示出来。需要注意的  是  print这项措施  只能显示  成员为整数的集合。

向NSSet  或者  NSMutableSet这两类物件  发送  setWithObjects:这条消息  可以创建出  以这条消息的参数为成员的集合。

创建了  三个集合过后,我  对  前两个集合  采取了  print这项措施,将  他们的成员  显示出来。

isEqualToSet:这项措施  用来检查  其实施对象所代表的集合  与  其参数代表的集合所包含的成员  是否一致。

containsObject:这项措施  用来检查  其实施对象所代表的集合当中  是否包含  其参数所代表的成员。

接下来  程序当中  对  集合setOne  分别  采取了  addObject:  和  removeObject:这两项措施。addObject:这项措施  会将其参数所代表的物件  添加到  其实施对象所代表的集合当中。而  removeObject:这项措施  会从其实施对象所代表的集合当中  将  其参数所代表的成员  去除。

接着  在程序当中  我  对  集合setOne  采取了  intersectSet:这项措施,参数  为  集合setTwo。intersectSet:这项措施  会计算出  集合setOne  和  集合setTwo的交集,也就是  找出  这两个集合中  哪些成员  是  都有的。intersectSet:这项措施  会用  两个集合的交集 来覆盖  其实施对象,也就是  集合setOne。

再然后  我  对  集合setOne  采取了  unionSet:这项措施,参数  为  集合setTwo。intersectSet:这项措施  会计算出  集合setOne  和  集合setTwo的并集,也可以叫做  联集。也就是  找出  这两个集合的所有成员。不熟悉的  可以  在网上查找一下  并集的概念。与  intersectSet:这项措施  一样,unionSet:这项措施  也会用  两个集合的并集  来覆盖  其实施对象,也就是说  集合setOne  是  最后的结果。

在基础框架当中  还有  一类集合物件  叫做  NSCountedSet。NSCountedSet这类物件所代表的集合中  允许出现  相同的成员。当某个物件  第一次  添加  到这样的集合中时,集合  就增加了  一个成员。当同样的物件  再次  添加  到这样的集合当中时,集合  就再次增加  一个成员。countForObject:这项措施  可以计算出  其参数所代表的成员  在集合中  出现的次数。

下面表格里的措施  适用于  NSSet这类物件:

措施名称 描述
+(id)setWithObjects:物件1,物件2,……,nil 创建一个新的集合。新创建的集合包含了参数中列举的物件
-(id)initWithObject:物件1,物件2,……,nil 对已经分配了内存空间的集合进行初始化,并且将参数中的物件添加到集合当中
-(NSUInteger)count 计算出集合中成员的数量
-(BOOL)containObject:物件 判断其实施对象中是否包含某个成员
-(BOOL)member:物件 判断其实施对象中是否包含某个成员
-(NSEnumerator *)objectEnumerator: 为其实施对象中的成员生成一个NSEnumerator类型的物件
-(BOOL)isSubsetOfSet:nsset 判断其实施对象中的成员是否在nsset这个集合中出现
-(BOOL)intersectsSet:nsset 判断其实施对象与nsset是否存在交集
-(BOOL)isEqualToSet:nsset 判断其实施对象与nsset中的成员是否一致

下面表格中的措施  适用于  NSMutableSet这类物件

措施名称 描述
+(id)setWithCapacity:size 创建容量为size的集合
-(id)initWithCapacity:size 将已经分配了内存空间的集合的容量设定为size
-(void)addObject:物件 将物件添加到其实施对象所代表的集合当中
-(void)removeObject:物件 从其实施对象所代表的集合当中将物件删除
-(void)removeAllObjects 将其实施对象中的所有成员删除
-(void)unionSet:nsset 求其实施对象与参数的并集
-(void)minusSet:nsset 求其实施对象与参数的差集
-(void)intersectSet:nsset 求其实施对象与参数的交集

六十二、基础框架(二十)集合物件相关推荐

  1. 六十、基础框架(十八)辞典物件

    辞典物件  就是  一种数据集合.这种数据集合  由若干对"关键字-物件"组合  构成.就像  你  可以  在辞典里  找到  某个词的定义,在objective-c里面的辞典物 ...

  2. 【六】Java基础(05)---集合

    目录 一.集合框架的概述 二.集合 <一> Collenctions 接口 (一)list 接口 (二)set接口 <二>map 接口 一.集合框架的概述 1.集合.数组都是对 ...

  3. C/C++基础讲解(二十六)之数值计算与趣味数学篇(打鱼还是晒网与怎样存钱以获取最大利息)

    C/C++基础讲解(二十六)之数值计算与趣味数学篇(打鱼还是晒网与怎样存钱以获取最大利息) 程序之美 前言 很多时候,特别是刚步入大学的学子们,对于刚刚开展的计算机课程基本上是一团迷雾,想要弄明白其中 ...

  4. Java实习生常规技术面试题每日十题Java基础(二)

    目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...

  5. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星 ...

  6. IM开发者的零基础通信技术入门(十二):上网卡顿?网络掉线?一文即懂!

    [来源申明]本文引用了微信公众号"鲜枣课堂"的<上网慢?经常掉线?这篇文章告诉你该怎么办!>文章内容.为了更好的内容呈现,即时通讯网在引用和收录时内容有改动,转载时请注 ...

  7. PyTorch框架学习十二——损失函数

    PyTorch框架学习十二--损失函数 一.损失函数的作用 二.18种常见损失函数简述 1.L1Loss(MAE) 2.MSELoss 3.SmoothL1Loss 4.交叉熵CrossEntropy ...

  8. 鸟哥的Linux私房菜(服务器)- 第十六章、文件服务器之二: SAMBA 服务器

    第十六章.文件服务器之二: SAMBA 服务器 最近更新日期:2011/07/29 如果想要共享档案,在 Linux 对 Linux 的环境下,最简单的方法就是透过 NIS 这玩意儿了!至于 Wind ...

  9. linux 正点原子ov5640_【正点原子FPGA连载】第二十六章基于OV5640的二值化实验-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...

    本帖最后由 正点原子 于 2020-10-26 16:21 编辑 QQ群头像.png (1.78 KB) 2020-10-24 10:50 上传5)关注正点原子公众号,获取最新资料 100846rel ...

最新文章

  1. mysql的结构,段页区,及客户端命令
  2. Hbase 学习(三)Coprocessors
  3. 云上主机SSH秘钥对连接linux注意事项
  4. execl用宏查询mysql_关于EXCEL能否用宏直接连到oracle数据库然后取数据
  5. 对存储还搞不清楚,先看看这篇文章-从51单片机上去理解存储器
  6. 抖音客新版UI短视频点赞任务系统完美运营级别[等级功能+信誉积分+保证金]
  7. Golang实践录:测试框架
  8. Android 优化布局层次结构
  9. 在SQUIRREL中使用PHOENIX操作HBASE——创建表和视图
  10. VSCode SSH 远程连接
  11. 神经网络的三种训练方法,如何训练一个神经网络
  12. 279. 完全平方数 (数学定理 四平方数之和定理)
  13. #幻方#明汯#九坤#鸣石#天演#进化论#佳期#量化研究员#C++#量化#量化私募#量化企业#量化投资#量化基金#机器学习#量化市场#量化期权#量化交易岗#量化数据岗#量化运维#量化可转债研究员#深
  14. java中时区的时令问题
  15. [SCOI 2016]幸运数字
  16. 基于PHP+小程序(MINA框架)+Mysql数据库的干洗店洗衣小程序系统设计与实现
  17. laravel中seed
  18. php 区位码字符,PHP汉字转区位码用法示例
  19. wkwebview替换uiwebview_使用WKWebView替换UIWebView
  20. Docker入门指南

热门文章

  1. Adobe Illustrator(AI)中输入希腊字母等特殊字符
  2. Mac 不能写入移动硬盘的解决方案
  3. c/c++播放音乐(PlaySound、mciSendString、mciSendCommand)
  4. 烛光晚餐矢量图(编号:82204)_日常生活_矢量人物_矢量素材
  5. 上学期c语言作业答案,C语言作业答案4
  6. 网站渗透测试之常见漏洞排行
  7. Emby识别都是英文海报
  8. 上传文件计算机传输的,文件全能王怎么把文件传到电脑上 文件全能王文件上传到电脑教程...
  9. xie wen ben ri zhi
  10. SpringBoot整合Redis配置MyBatis二级缓存