1、NSSortDescriptor排序
概述:
数组是有序容器,因此集合中只有数组才能排序。该类能够方便的实现对数组中的对象进行升序或者降序的排序。它可以把元素的某个属性作为key进行升序或降序的排序,每个NSSortDescriptor对象就是一个排序条件。
NSSortDescriptor初始化方法
- (instancetype)initWithKey:(NSString *)key ascending:(BOOL)ascending;
key:按照数组中对象的哪个属性进行排序,如果数组中存放的是能够直接排序的对象(比如:字符串),直接使 @"self" 或者 nil 即可;如果存放的是自定义类的对象,使用想要进行排序的属性名即可(比如:想按照Person类的name进行排序, 使用 @"name" 作为参数)。ascending:排序的标志,是升序还是降序。 YES - 升序, NO - 降序。
NSSortDescriptor创建
NSSortDescriptor *sortDes1 = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]; // 升序
NSSortDescriptor *sortDes2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; // 降序
① 不可变数组排序
// 基本数据类型不可变数组
array = [array sortedArrayUsingDescriptors:@[sortDes1]];
NSLog(@"%@", array);
// 自定义对象不可变数组
// 按照名字排序
personArray = [personArray sortedArrayUsingDescriptors:@[sortDes2]];
NSLog(@"%@", personArray);
② 可变数组排序
// 基本类型可变数组
[mArray sortUsingDescriptors:@[sortDes1]];
NSLog(@"%@", mArray);
// 自定义对象可变数组
// 按照名字排序
[personMArray sortUsingDescriptors:@[sortDes2]];
NSLog(@"%@", personMArray);
2、使用数组中 两个元素比较的方法名 进行排序
① 不可变数组排序:(排序结果生成新数组, 原数组无改变)
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator;
注:SEL类型的参数comparator:需要传入一个返回结果是NSComparisonResult的方法名。
// 可变数组(基本数据类型)
[mArray sortUsingSelector:@selector(compare:)];
NSLog(@"%@", mArray);
// 可变的数组(自定义类型的对象)
// 按照名字排序
[personMArray sortUsingSelector:@selector(compareByName:)];
NSLog(@"%@", personMArray);
② 可变数组排序:(直接对原数组操作,无新数组生成)
- (void)sortUsingSelector:(SEL)comparator;
注:SEL类型的参数comparator:需要传入一个返回结果是NSComparisionResult的函数
// 可变数组(基本数据类型)
[mArray sortUsingSelector:@selector(compare:)];
NSLog(@"%@", mArray);
// 可变的数组(自定义类型的对象)
// 按照名字排序
[personMArray sortUsingSelector:@selector(compareByName:)];
NSLog(@"%@", personMArray);
Person类中compareByName方法:
// 比较方法的声明
- (NSComparisonResult)compareByName:(Person *)anotherPerson;
// 比较方法的实现
- (NSComparisonResult)compareByName:(Person *)anotherPerson
{
return [self.name compare:anotherPerson.name];
}
上面方法排完序后返回的数组英文和汉字是分开的,所以如需将汉字也排入英文中,请参考:https://github.com/lingxuemy/XCompareString.git
网友评论