如果 一本地址簿 有 大量的地址卡片,那么 将 这些地址卡片 按照 字母表顺序 排列 就会带来 不小的方便。我们 可以 轻松地 编写 一项适用于AddressBook这类物件的措施sort。在sort这项措施当中,我们 可以利用 适用于NSMutableArray这类物件的措施sortUsingSelector:。sortUsingSelector:这项措施自己
并不能判断 两个物件的大小或者先后顺序,于是 我们 必须编写 一项可以判断两个物件大小或者先后顺序的措施,并且 将 这个措施的标志 作为参数 传递给 sortUsingSelector:这项措施。sortUsingSelector:这项措施 再 才能 根据 每两个物件的大小或者先后顺序 进行排序。
由于 我们 要对 地址簿中的地址卡片 进行排序,所以 分别 在AddressBook.h这个文件 和 AddressBook.m这个文件中 添加
这行语句 和
|
-(void)sort
{
[booksortUsingSelector:@selector(compareNames:)];
}
|
这几行语句。
在sort这项措施当中
这行语句 会利用 compareNames:这项措施的名称 生成 一个SEL类型的标志。sortUsingSelector:这项措施 会利用 compareNames:这项措施的标志 来采取 compareNames:这项措施 进而 比较 每两个物件的大小 或者 先后顺序,最后 根据 每两个物件的大小 或 先后顺序 对 一连串的物件 进行排序。
既然 sortUsingSelector:这项措施 要利用 compareNames:这项措施对每两个物件进行比较的结果 才能排序,那么 我们 接下来 要看看 如何编写 compareNames:这项措施。由于 compareNames:这项措施 要比较 两个地址卡片的顺序,所以 我们 要 在AddressCard.h 和 AddressCard.m这两个文件中 分别 添加:
|
-(NSComparisonResult)compareNames:(id)element;
|
和
| -(NSComparisonResult)compareNames:(id)element { return [self.name compare:[element name]]; } |
compareNames:这项措施 要对 地址卡片 进行比较,只需要比较 每两张地址卡片中姓名在字母表中的先后顺序 即可。而 每张地址卡片中的姓名 都属于 NSString类型的字符串物件, 恰好 有 一项适用于NSString类型物件的措施 可以比较 两个字符串的先后顺序 叫做 compare:。在compareNames:这项措施当中 我 对 其实施对象中的姓名name 采取了 compare:这项措施,并且 将 其参数中的姓名name 作为参数,从而 对 其实施对象 和 其参数 进行比较。compare:这项措施产生的结果 是 NSComparisonResult类型的常量。常量NSComparisonResult的三个值 分别 表示 升序、降序 和 相同。
接下来 我们 看看 在具体的程序当中,sort这项措施 是否能够 如愿地 工作:
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
|
#import <Foundation/NSAutoreleasePool.h>
#import "AddressBook.h"
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
AddressCard*cardOne=[[AddressCardalloc]init];
AddressCard*cardTwo=[[AddressCardalloc]init];
AddressCard*cardThree=[[AddressCardalloc]init];
AddressCard*cardFour=[[AddressCardalloc]init];
[cardOnesetName:@"Zijin
Zhang"andEmail:@"540596744@qq.com"];
[cardTwosetName:@"Tony
Iannino"andEmail:@"tony.iannino@techfitness.com"];
[cardThreesetName:@"Jamie
Baker"andEmail:@"jbaker@kochan-wood.com"];
[cardFoursetName:@"Julia
Kochan"andEmail:@"jewls337@axlc.com"];
AddressBook*myBook=[[AddressBookalloc]initWithName:@"Zijin's
Address Book"];
[myBookaddCard:cardOne];
[myBookaddCard:cardTwo];
[myBookaddCard:cardThree];
[myBookaddCard:cardFour];
[myBooklist];
[myBooksort];
[myBooklist];
[cardOnerelease];
[cardTworelease];
[cardThreerelease];
[cardFourrelease];
[myBookrelease];
[pooldrain];
return0;
}
|
运行 这个程序过后,可以得到 这样地结果:
| 2012-04-27 14:14:25.162 Sample[813:707] ========Zijin's Address Book的内容======== 2012-04-27 14:14:25.207 Sample[813:707] Zijin Zhang 540596744@qq.com 2012-04-27 14:14:25.207 Sample[813:707] Tony Iannino tony.iannino@techfitness.com 2012-04-27 14:14:25.208 Sample[813:707] Jamie Baker jbaker@kochan-wood.com 2012-04-27 14:14:25.208 Sample[813:707] Julia Kochan jewls337@axlc.com 2012-04-27 14:14:25.208 Sample[813:707] ========================================= 2012-04-27 14:14:25.209 Sample[813:707] ========Zijin's Address Book的内容======== 2012-04-27 14:14:25.209 Sample[813:707] Jamie Baker jbaker@kochan-wood.com 2012-04-27 14:14:25.210 Sample[813:707] Julia Kochan jewls337@axlc.com 2012-04-27 14:14:25.210 Sample[813:707] Tony Iannino tony.iannino@techfitness.com 2012-04-27 14:14:25.211 Sample[813:707] Zijin Zhang 540596744@qq.com 2012-04-27 14:14:25.211 Sample[813:707] ========================================= |
从程序的运行结果 看来,sort这项措施 的确 像我们所期望的那样 将 地址簿中的卡片 按照字母表顺序 进行了排列。
需要注意的 是 上面排列的顺序 是 升序。如果 要降序排列,我们 需要将compareNames:所产生的结果 进行颠倒 即可,就像 这样:
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
|
-(NSComparisonResult)compareNames:(id)element
{
if([self.namecompare:[elementname]]==NSOrderedAscending)
{
returnNSOrderedDescending;
}
elseif([self.namecompare:[elementname]]==NSOrderedDescending)
{
returnNSOrderedAscending;
}
else
{
returnNSOrderedSame;
}
}
|
其中 NSOrderedAscending 和 NSOrderedDescending这两个常量 分别 表示 升序 和 降序。在compareNames:这项措施中,如果 compare:这项措施的结果 是 升序,那么 就将 降序 作为结果 传递回去;如果 compare:这项措施的结果 是 降序,那么 就将 升序 作为结果 传递回去;如果 compare:这项措施的结果 既不是 升序 也不是 降序,那么 就把 表示一致的常量NSOrderedSame
作为结果 传递回去。
再次 运行 这个程序,我们 可以得到 这样的结果:
1
2
3
4
5
6
7
8
9
10
11
12
|
2012-04-27 16:27:03.319 Sample[1008:707] ========Zijin's Address Book的内容========
2012-04-27 16:27:03.321 Sample[1008:707] Zijin Zhang 540596744@qq.com
2012-04-27 16:27:03.321 Sample[1008:707] Tony Iannino tony.iannino@techfitness.com
2012-04-27 16:27:03.322 Sample[1008:707] Jamie Baker jbaker@kochan-wood.com
2012-04-27 16:27:03.322 Sample[1008:707] Julia Kochan jewls337@axlc.com
2012-04-27 16:27:03.323 Sample[1008:707] =========================================
2012-04-27 16:27:03.323 Sample[1008:707] ========Zijin's Address Book的内容========
2012-04-27 16:27:03.324 Sample[1008:707] Zijin Zhang 540596744@qq.com
2012-04-27 16:27:03.324 Sample[1008:707] Tony Iannino tony.iannino@techfitness.com
2012-04-27 16:27:03.325 Sample[1008:707] Julia Kochan jewls337@axlc.com
2012-04-27 16:27:03.325 Sample[1008:707] Jamie Baker jbaker@kochan-wood.com
2012-04-27 16:27:03.325 Sample[1008:707] =========================================
|
在这个结果中,我们 可以看到 地址簿中的卡片 已经按照降序 排列了。
另外 有 超过50项措施 我们 可以对 数组物件 实施。下面表格中的措施 适用于 不可修改数组物件,也就是 NSArray类型的物件:
措施名称 |
描述 |
+(id)arrayWithObjects:obj1,obj2,…nil |
创建 一个新的数组物件,新创建的数组物件当中,存储着物件obj1,obj2…等物件 |
-(BOOL)containObject:obj |
判断其实施对象中是否包含物件obj |
-(NSUInteger)count |
计算出一个数组物件所包含的元素的数量 |
-(NSUInteger)indexOfObject:obj |
计算出物件obj在其实施对象中位于第几个位置 |
-(id)objectAtIndex:i |
将其实施对象中第i个物件读取出来 |
-(void)makeObjectsPerformSelector:(SEL)selector |
对其实施对象中的每个元素采取(SEL)selector所代表的措施 |
-(NSArray *)sortedArrayUsingSelector:(SEL)selector |
根据(SEL)selector所代表的措施比较每两个物件的结果对数组中的物件进行排序,其产生的结果为经过排序了的数组物件 |
-(BOOL)writeToFile:path atomically:(BOOL)flag |
将数组物件写入path所代表的文件,如果(BOOL)flag的值为YES,那么就创建一个临时文件 |
下面的措施 适用于 可修改数组物件,也就是 NSMutableArray类型的物件
措施名称 |
表述 |
+(id)array |
创建一个不包含任何元素的数组物件 |
+(id)arrayWithCapacity:size |
创建一个不包含任何元素,且长度为size的数组物件 |
-(id)initWithCapacity:size |
对已经分配了内存地址的数组物件进行初始化,并且将其长度设定为size |
-(void)addObject:obj |
将物件obj添加到其实施对象的末尾处 |
-(void)insertObject:obj atIndex:i |
将物件obj插入到其实施对象中第i个位置 |
-(void)replaceObjectAtIndex:i withObject:obj |
将其实施对象中第i个位置上的物件替换成物件obj |
-(void)removeObject:obj |
将其实施对象中的物件obj删除 |
-(void)removeObjectAtIndex:i |
将其实施对象中第i个物件删除 |
-(void)sortUsingSelector:(SEL)selector |
根据(SEL)selector所代表的措施对其实施对象中每两个物件的比较结果进行排序 |