通过函数进行排序
- (NSArray )sortedArrayUsingFunction:(NSInteger ()(ObjectType, ObjectType, void * __nullable))comparator context:(nullable void *)context;
NSArray *sortArray = [[NSArray alloc] initWithObjects:@"2",@"13",@"4",@"17",@"8",@"1",@"26",@"5",@"3",@"15",@"12",@"20",@"25",@"7",nil];
//排序前
for (NSString *str in sortArray) {
NSLog(@"排序前%@", str);
}
NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil];
for (NSString *str in array) {
NSLog(@"排序后%@", str);
}
排序函数:
NSInteger customSort(id obj1, id obj2, void* context){
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}
##通过NSComparator进行排序
- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr
NSComparator cmptr = ^(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 = [[NSArray alloc] initWithObjects:@"2",@"13",@"4",@"17",@"8",@"1",@"26",@"5",@"3",@"15",@"12",@"20",@"25",@"7",nil];
//排序前
for (NSString *str in sortArray) {
NSLog(@"排序前%@", str);
}
//第一种排序
NSArray *array = [sortArray sortedArrayUsingComparator:cmptr];
for (NSString *str in array) {
NSLog(@"排序后%@", str);
}
通过NSSortDescriptor进行排序
- (instancetype)sortDescriptorWithKey:(nullable NSString *)key ascending:(BOOL)ascending
NSArray *numArr = [[NSArray alloc] initWithObjects:@"2",@"13",@"4",@"17",@"8",@"1",@"26",@"5",@"3",@"15",@"12",@"20",@"25",@"7",nil];
NSSortDescriptor *sd_num = [NSSortDescriptor sortDescriptorWithKey:nil ascending:NO];
NSArray *arr1 = [numArr sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sd_num, nil]];
for (NSString *str in arr1) {
NSLog(@"%@", str);
}
注
在方法一, 二中, 返回排序的枚举可以用下面的方法来代替
return [obj1 compare:obj2 options:NSNumericSearch];
1.NSComparisonResult
其实返回的都是NSComparisonResult的一个枚举值, 来标示升降序的.
NSComparisonResult 是定义的一个枚举,定义如下:
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
2.NSString比较的方法
上面比较的是 NSString类型的数据, 所以可以使用以下的 NSString 比较的方法
- (NSComparisonResult)compare:(NSString *)string;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(id)locale;
3.NSStringCompareOptions
这些方法中有一个参数, NSStringCompareOptions的枚举, 这些枚举的意义如下:
enum{
NSCaseInsensitiveSearch = 1,//不区分大小写比较
NSLiteralSearch = 2,//区分大小写比较
NSBackwardsSearch = 4,//从字符串末尾开始搜索
NSAnchoredSearch = 8,//搜索限制范围的字符串
NSNumbericSearch = 64//按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt
//以下定义高于 mac os 10.5 或者高于 iphone 2.0 可用
,
NSDiacriticInsensitiveSearch = 128,//忽略 "-" 符号的比较
NSWidthInsensitiveSearch = 256,//忽略字符串的长度,比较出结果
NSForcedOrderingSearch = 512//忽略不区分大小写比较的选项,并强制返回 NSOrderedAscending 或者 NSOrderedDescending
//以下定义高于 iphone 3.2 可用
,
NSRegularExpressionSearch = 1024//只能应用于 rangeOfString:..., stringByReplacingOccurrencesOfString:...和 replaceOccurrencesOfString:... 方法。使用通用兼容的比较方法,如果设置此项,可以去掉 NSCaseInsensitiveSearch 和 NSAnchoredSearch
}