如果 一本地址簿 有 大量的地址卡片,那么 将 这些地址卡片 按照 字母表顺序 排列 就会带来 不小的方便。我们 可以 轻松地 编写 一项适用于AddressBook这类物件的措施sort。在sort这项措施当中,我们 可以利用 适用于NSMutableArray这类物件的措施sortUsingSelector:。sortUsingSelector:这项措施自己 并不能判断 两个物件的大小或者先后顺序,于是 我们 必须编写 一项可以判断两个物件大小或者先后顺序的措施,并且 将 这个措施的标志 作为参数 传递给 sortUsingSelector:这项措施。sortUsingSelector:这项措施 再 才能 根据 每两个物件的大小或者先后顺序 进行排序。
由于 我们 要对 地址簿中的地址卡片 进行排序,所以 分别 在AddressBook.h这个文件 和 AddressBook.m这个文件中 添加
这行语句 和
|
-
(
void
)
sort
{
[
book
sortUsingSelector
:
@selector
(
compareNames
:
)
]
;
}
|
这几行语句。
在sort这项措施当中
|
@selector
(
compareNames
:
)
|
这行语句 会利用 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"
int
main
(
int
argc
,
const
char
*argv
[
]
)
{
NSAutoreleasePool
*pool
=
[
[
NSAutoreleasePool
alloc
]
init
]
;
AddressCard
*cardOne
=
[
[
AddressCard
alloc
]
init
]
;
AddressCard
*cardTwo
=
[
[
AddressCard
alloc
]
init
]
;
AddressCard
*cardThree
=
[
[
AddressCard
alloc
]
init
]
;
AddressCard
*cardFour
=
[
[
AddressCard
alloc
]
init
]
;
[
cardOne
setName
:
@"Zijin Zhang"
andEmail
:
@"540596744@qq.com"
]
;
[
cardTwo
setName
:
@"Tony Iannino"
andEmail
:
@"tony.iannino@techfitness.com"
]
;
[
cardThree
setName
:
@"Jamie Baker"
andEmail
:
@"jbaker@kochan-wood.com"
]
;
[
cardFour
setName
:
@"Julia Kochan"
andEmail
:
@"jewls337@axlc.com"
]
;
AddressBook
*myBook
=
[
[
AddressBook
alloc
]
initWithName
:
@"Zijin's Address Book"
]
;
[
myBook
addCard
:
cardOne
]
;
[
myBook
addCard
:
cardTwo
]
;
[
myBook
addCard
:
cardThree
]
;
[
myBook
addCard
:
cardFour
]
;
[
myBook
list
]
;
[
myBook
sort
]
;
[
myBook
list
]
;
[
cardOne
release
]
;
[
cardTwo
release
]
;
[
cardThree
release
]
;
[
cardFour
release
]
;
[
myBook
release
]
;
[
pool
drain
]
;
return
0
;
}
|
运行 这个程序过后,可以得到 这样地结果:
1
2
3
4
5
6
7
8
9
10
11
12
|
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
.
name
compare
:
[
element
name
]
]
==
NSOrderedAscending
)
{
return
NSOrderedDescending
;
}
else
if
(
[
self
.
name
compare
:
[
element
name
]
]
==
NSOrderedDescending
)
{
return
NSOrderedAscending
;
}
else
{
return
NSOrderedSame
;
}
}
|
其中 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所代表的措施对其实施对象中每两个物件的比较结果进行排序 |