OC对数组排序有很多种方法
首先声明一个Person类并重写父类的description方法 不会的同学请参照我的博客:
OC的开始(一)之----HelloWord与类的创建及使用
这里说一下重写的父类description方法:当我们不重写这个方法的时候,直接打印出得结果是对象,看代码:
// 声明多个Person对象
Person *p1 = [Person personWithName:@"zhangsan" number:10001 age:26 score:90.5];
Person *p2 = [Person personWithName:@"lisi" number:10002 age:22 score:91.5];
Person *p3 = [Person personWithName:@"wangwu" number:10004 age:24 score:90.5];
Person *p4 = [Person personWithName:@"zhaoliu" number:10003 age:25 score:92.5];
Person *p5 = [Person personWithName:@"xiaoqi" number:10008 age:26 score:96.5];
Person *p6 = [Person personWithName:@"bazai" number:10006 age:27 score:93.5];
Person *p7 = [Person personWithName:@"xiaojiu" number:10005 age:21 score:92.5];
Person *p8 = [Person personWithName:@"shidi" number:10007 age:18 score:99.5];
// 声明一个不可变数组
NSArray *persons = [NSArray arrayWithObjects:p1, p2, p3, p4, p5, p6, p7, p8, nil];
NSLog(@"%@", persons);
2015-05-22 15:31:47.320 Test02[1653:116214] (
"<Person: 0x100200f80>",
"<Person: 0x100201270>",
"<Person: 0x1002012e0>",
"<Person: 0x100201350>",
"<Person: 0x1002013c0>",
"<Person: 0x100201430>",
"<Person: 0x1002014a0>",
"<Person: 0x100201510>"
)
这样执行的的显示结果是每一个元素对象在堆内存中站得地址,那么我们看看把description重写后再次打印的结果:
在Person.m文件中重写description方法
- (NSString *)description
{
return [NSString stringWithFormat:@"name = %@ number = %ld age = %ld score = %.2f", _name, _number, _age, _score];
}
然后打印结果:
2015-05-22 15:35:00.174 Test02[1669:117516] (
"name = zhangsan number = 10001 age = 26 score = 90.50",
"name = lisi number = 10002 age = 22 score = 91.50",
"name = wangwu number = 10004 age = 24 score = 90.50",
"name = zhaoliu number = 10003 age = 25 score = 92.50",
"name = xiaoqi number = 10008 age = 26 score = 96.50",
"name = bazai number = 10006 age = 27 score = 93.50",
"name = xiaojiu number = 10005 age = 21 score = 92.50",
"name = shidi number = 10007 age = 18 score = 99.50"
)
很明显,当我们直接打印数组的时候,系统调用了父类的description方法。
现在开始我们的排序之旅:
一、使用冒泡排序:
// 定义一个可变数组,将persons的值赋给可变数组
NSMutableArray *muPersons = [NSMutableArray arrayWithArray:persons];
// 使用冒泡按照number进行升序排序
for (int i = 0; i < muPersons.count - 1; i++) {
for (int j = 0; j < muPersons.count - 1 - i; j++) {
// 前一个元素的number属性大于后一个元素的number属性时 两个元素交换位置
if ([muPersons[j] number] > [muPersons[j + 1] number]) {
[muPersons exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
}
}
}
NSLog(@"%@", muPersons);
查看结果:
2015-05-22 15:50:26.322 Test02[1719:122150] (
"name = zhangsan number = 10001 age = 26 score = 90.50",
"name = lisi number = 10002 age = 22 score = 91.50",
"name = zhaoliu number = 10003 age = 25 score = 92.50",
"name = wangwu number = 10004 age = 24 score = 90.50",
"name = xiaojiu number = 10005 age = 21 score = 92.50",
"name = bazai number = 10006 age = 27 score = 93.50",
"name = shidi number = 10007 age = 18 score = 99.50",
"name = xiaoqi number = 10008 age = 26 score = 96.50"
)
二、使用sortedArrayUsingSelector排序:
使用sortedArrayUsingSelector之前,需要我们在person中写专门写一个排序的方法供sortedArrayUsingSelector使用。
在person.h文件中自定义排序方法compareSortNumber:
// 自定义排序方法
- (NSComparisonResult)compareSortNumber:(Person *)person;
在person.m文件中实现排序:
// 自定义排序方法
- (NSComparisonResult)compareSortNumber:(Person *)person
{
if ([self number] > [person number]) {
return NSOrderedDescending;
}
return NSOrderedSame;
}
在main.m文件中调用sortedArrayUsingSelector对number进行升序排列
// 使用sortedArrayUsingSelector对number进行升序排列
NSArray *selArray = [persons sortedArrayUsingSelector:@selector(compareSortNumber:)];
NSLog(@"%@", selArray);
运行结果:
2015-05-22 16:33:49.996 Test02[1927:136447] (
"name = zhangsan number = 10001 age = 26 score = 90.50",
"name = lisi number = 10002 age = 22 score = 91.50",
"name = zhaoliu number = 10003 age = 25 score = 92.50",
"name = wangwu number = 10004 age = 24 score = 90.50",
"name = xiaojiu number = 10005 age = 21 score = 92.50",
"name = bazai number = 10006 age = 27 score = 93.50",
"name = shidi number = 10007 age = 18 score = 99.50",
"name = xiaoqi number = 10008 age = 26 score = 96.50"
)
三、使用sortedArrayUsingComparator对number进行升序排列
// 使用sortedArrayUsingComparator对number进行升序排列
NSArray *comArray = [persons sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Person *p1 = obj1;
Person *p2 = obj2;
if ([p1 number] > [p2 number]) {
return NSOrderedDescending;
}
return NSOrderedSame;
}];
NSLog(@"%@", comArray);
运行结果:
2015-05-22 17:02:44.189 Test02[2039:148253] (
"name = zhangsan number = 10001 age = 26 score = 90.50",
"name = lisi number = 10002 age = 22 score = 91.50",
"name = zhaoliu number = 10003 age = 25 score = 92.50",
"name = wangwu number = 10004 age = 24 score = 90.50",
"name = xiaojiu number = 10005 age = 21 score = 92.50",
"name = bazai number = 10006 age = 27 score = 93.50",
"name = shidi number = 10007 age = 18 score = 99.50",
"name = xiaoqi number = 10008 age = 26 score = 96.50"
)
总结:
使用冒泡排序的时候 我们需要重新定义可变数组对数组中的元素进行排序,sortedArrayUsingSelector排序我们需要写单独写一个方法给sortedArrayUsingSelector调用,太麻烦了,最后一种方法是OC中最常用的排序方法。