常用方法1:
简单排序:sortedArrayUsingSelector: // 这就是一个方法名,包括冒号,调用这个方法的对象必须是 NSArray 对象。
实际调用代码:
int main() {
NSArray *array = [NSArray arrayWithObjects:@"abc",@"156",@"163",@"789",@"aef", nil];
NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];// 表示参数是一个 SEL,即一个方法,这个方法的方法名就是 compare:,包括冒号。
NSLog(@"%@",sortedArray);
return 0;
}}
按照规定的方法来排序数组,并且返回一个新的排序好的数组。
可以另写compare:方法来自定义排序的规则,重写格式如下:
//自定义排序方法
-(NSComparisonResult)comparePerson:( Person *)person{
//默认按年龄排序
NSComparisonResult result = [[NSNumber numberWithInt:person.age] compare:[NSNumber numberWithInt:self.age]];//注意:基本数据类型要进行数据转换
//如果年龄一样,就按照名字排序
if (result == NSOrderedSame) {
result = [self.name compare:person.name];
}
return result;
}
- (NSComparisonResult) compareStu:(Student *) stu // compare 的参数是一个数组,要排序的数组
{
NSComparisonResult result = [[NSNumber numberWithDouble:stu.score ] compare:[NSNumbernumberWithDouble:self.score]];
if(result == NSOrderedSame)
{
result = [[NSNumber numberWithDouble:stu.age ] compare:[NSNumber numberWithDouble:self.age]];
if(result == NSOrderedSame)
{
result = [stu.name compare:self.name];
}
}
return result;
}
调用格式如下:
// selector 就是 SEL,表示一个方法,一个规则,按照什么规则排序,将自定义的方法作为参数,但是只能排序 NSnumber 类型的数据,
NSArray *sortedStudents = [students sortedArrayUsingSelector:@selector(compareStu:)];
常用方法2:
使用 block 语法:sortedArrayUsingComparator:
不同方法1的地方在于一个是 selector,一个是 comparator,格式如下:
NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { } ]; // 红色部分是一个 block,使用这个方法是直接在 block 中编写方法即可,也可以先单独写好一个 block,在传入一个 block 作为参数即可
NSLog(@"排序后:%@",sortedArray); }
用法如下:
int main() {
// NSComparator myComparator = ^(id obj1, id obj2){
// if ([obj1 integerValue] > [obj2 integerValue]) {
// return (NSComparisonResult)NSOrderedDescending;
// }
//
// if ([obj1 integerValue] < [obj2 integerValue]) {
// return (NSComparisonResult)NSOrderedAscending;
// }
// return (NSComparisonResult)NSOrderedSame;
// };
NSArray *sortArray = @[@"3",@"1",@"4",@"7",@"8",@"2",@"6",@"5"];
NSLog(@"排序前:%@",sortArray);
// NSArray *array = [sortArray sortedArrayUsingComparator:myComparator]; // 也可以使用这样的写法,传入一个block 作为参数。
NSArray *array = [sortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
if ([obj1 integerValue] < [obj2 integerValue]) { // 大于小于用于控制返回的数组是升序排序还是降序排列
return NSOrderedDescending;
}
if ([obj1 integerValue] > [obj2 integerValue]) { // 大于小于用于控制返回的数组是升序排序还是降序排列
return NSOrderedAscending;
}
return NSOrderedSame;
}];
NSLog(@"排序后:%@",array);
return 0;
}
NSArray *array = @[p1,p2,p3,p4,p5];
//构建排序描述器,每一个要比较的属性对应一个描述器
NSSortDescriptor *carNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"car.name" ascending:YES];
NSSortDescriptor *personNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSSortDescriptor *personAgeDesc = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
//创建一个描述器数组,放入描述器对象,放入的顺序就是比较时优先比较什么属性的顺序
//例如:首先按照年龄排序,然后是车的名字,最后是按照人的名字
NSArray *descriptorArray = [NSArray arrayWithObjects:personAgeDesc,carNameDesc,personNameDesc,nil];
// 描述器数组中存放的只是描述器对象,并不是要排序的数组内容
NSLog(@"%@",descriptorArray);
// 将描述器数组作为参数传递给按描述器排序的方法,这个方法由要排序的数组调用,并且返回一个排序好的数组
NSArray *sortedArray = [array sortedArrayUsingDescriptors: descriptorArray];
NSLog(@"%@",sortedArray);
同样的,使用 compare 方法也可以实现一样的排序功能。不同的是 compare 的方法是按降序排列的。
- (NSComparisonResult) myCompare:(Person *)person
{
NSComparisonResult result = [[NSNumber numberWithDouble:person.age] compare:[NSNumber numberWithDouble:self.age]];
if(result == NSOrderedSame)
{
result = [person.car.name compare:self.car.name];
if(result == NSOrderedSame)
{
result = [person.name compare:self.name];
}
}
return result;
}
调用方法:
NSArray *sortedArray2 = [array sortedArrayUsingSelector:@selector(myCompare:)];
NSLog(@"%@",sortedArray2);
输出的顺序和 descriptor 的方法刚好相反。
在 OC 中还有非常多的排序方法,以上只是其中较常用的几个,想要学习更多知识可以参考官方的 API。