compare

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"White",@"Blue",@"Red",@"Black",nil];
    [array sortUsingSelector:@selector(compare:)];
    NSLog(@"sorted array:%@",array);
运行结果是:sorted array:(
    Black,
    Blue,
    Red,
    White
)
很显然,这里是按照ascii码来进行排序的。compare:的方法并没有编写。可以在帮助文档里找到一个函数
compare:
Returns the result of invoking compare:options:range: with no options and the receiver’s full extent as the range.

- (NSComparisonResult)compare:(NSString *)aString
Parameters
aString
The string with which to compare the receiver.
This value must not be nil. If this value is nil, the behavior is undefined and may change in future versions of Mac OS X.
Return Value
The result of invoking compare:options:range: with no options and the receiver’s full extent as the range.

Discussion
If you are comparing strings to present to the end-user, you should typically use localizedCompare: or localizedCaseInsensitiveCompare: instead.

这个方法会调用compare:options:range:的方法,并且后两个参数都是默认的值,返回值就是一个NSComparisonResult类型,也就是前面说过的说明receiver和sender两个参数的比较结果。

在调用sortUsingSelector()方法时,我们指定使用compare:方法来进行比较。它内部可能使用了类型来进行判断,因为这里比较的类型是NSString,所以会调用NSString 的compare:方法。排序的过程是不可见的,但是过程就是:取出各个元素,使用compare:比较,然后放到合适的位置。

因为NSString 类的扩展(category)中规定好了这个compare:方法,也就是说通过这个方法,已经知道了如何判定A 字串和B字串谁比较大,但是在我们自己定义好的类中,这样的compare方法需要自己来指定一个(比如我们定义一个Sudent的类型,然后规定排序的时候按照ID来排)。我把lz例子中的几个重要方法注释一下,帮助理解:

@interface AddressBook: NSObject <NSCopying,NSCoding>
{
    NSString *bookName;
    NSMutableArray *book; //用来存储AddressCard对象的可变数组
}

@implementation AddressCard

@synthesize name,email; //name为AddressCard 的一个成员,并作为属性提供

-(NSComparisonResult) compareNames: (id)element;
{
    return [name compare:[element name]]; //返回当前的name和传入参数element的属性name比较后的结果
                                                                        //因为name是NSString类型的,所以这个compare:方法是调用NSString 的compare方法
                                                                        //很显然,element应该也是一个AddressCard类型的对象
}

-(void)sort
{
    [book sortUsingSelector:@selector(compareNames:)]; //sort方法,book中存储着所有的AddressCard类型对象
                                                                                               //比较的方式就是调用compareNames:的方法
}

下面说一下排序的过程,假设现在book中只有两个元素,book1和book2, 它们的name属性值分别为@"The C Programming Language"和@"Beginning iPhone 4 Development",调用sortUsingSelector:方法后,操作如下:
1. 取出array中的book1
2. 调用 book1的compareNames:方法,把book2当作参数传入,比较两者的大小
3. 在compareNames:的内部,book1的name属性(因为是book1是receiver,因此这里的name就是它的成员)和book2的name(通过element传入book2对象)比较的返回值作为结果。这里是做NSString类型的比较,所以返回值应该是NSOrderedDescending(ascii 的值比对)。
4. 因为返回值说明,第一个元素比第二个元素要大,因此array中的两个元素会做位置的调换。
结束

当然,数组中的元素可能有多个,所以根据不同的排序方式,取元素比对的过程、移动元素的过程会不太一样(冒泡、堆排、快排)。但是使用这种方式是不需要关心的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值