集合 是 由若干独一无二的物件 构成的。集合 可以是 可修改的,也可以是 不可修改的。我们 可以 在集合当中 搜索 某个物件、添加 或者 去除 某个物件,我们 还可以比较 两个集合,求 两个集合的交集 或者 并集。
如果 要 在程序当中 使用 集合这类物件,那么 程序中 需要加入 下面这行语句:
| #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;
}
|
运行 这个程序 可以得到 这样的结果:
| 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 } |
程序中的
|
#define INTEGER_OBJECT(v) [NSNumber numberWithInteger:v]
|
这行语句 将 [NSNumber numberWithInteger:v] 命名为 INTEGER_OBJECT(v)。而 [NSNumber numberWithInteger:v]的作用 是 向NSNumber这类物件 发送 numberWithInteger:这条消息 从而 NSNumber这类物件 创建出 一个值为v的整数物件。所以 INTEGER_OBJECT(v)的作用 也就是 创建 一个值为v的整数物件。像 这样 给 某些语句 命名,可以少打 不少字。
|
@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 |
求其实施对象与参数的交集 |