首先明确两个定义
1.定义NSComparisonResult类型返回值
typedef NS_ENUM(NSInteger, NSComparisonResult)
{
//代表升续
NSOrderedAscending = -1L,
//代表相同
NSOrderedSame,
//代表降序
NSOrderedDescending
};
2.定义NSComparator block类型返回值
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
block进行排序(推荐使用)
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:@2];
[arr addObject:@1];
[arr addObject:@5];
[arr addObject:@3];
[arr addObject:@4];
//此方法是直接对arr排序,若要生成新数组排序则调用sortedArrayUsingComparator:
//若明确知道数组中元素的类型,也可以直接将id改为某确定类型
[arr sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2)
{
//此处的规则含义为:若前一元素比后一元素小,则返回降序(即后一元素在前,为从大到小排列)
if ([obj1 integerValue] < [obj2 integerValue])
{
return NSOrderedDescending;
}
else
{
return NSOrderedAscending;
}
}];
排序结果为 5,4,3,2,1
NSString类比较方法:
pare:区分大小写
caseInsensitiveCompare: 不区分大小写
localizedStandardCompare:根据当前语言环境的语言规则进行排序(语言环境可能会根据大小写,变音符号等等的顺序而发生改变)
NSString *value = @”1234567890”;
比较的方法:
[value compare:(NSString *)];
[value compare:(NSString *) options:(NSStringCompareOptions)];
[value compare:(NSString *) options:(NSStringCompareOptions) range:(NSRange)];
range:(NSRange)
比较字符串的范围
options:(NSStringCompareOptions)
传入 NSStringCompareOptions 枚举的值
enum{
NSCaseInsensitiveSearch = 1,#不区分大小写比较
NSLiteralSearch = 2,#区分大小写比较
NSBackwardsSearch = 4,#从字符串末尾开始搜索
NSAnchoredSearch = 8,#搜索限制范围的字符串
NSNumbericSearch = 64#按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt
}
SEL排序
NSMutableArray *arr = [NSMutableArray array];
for (NSInteger i = 0; i < 5; i++)
{
Student *stu = [Student new];
//生成10-20的随机数
stu.age = arc4random_uniform(10) + 10;
[arr addObject:stu];
}
#此处的sel应该理解为对数组中A对象调用自己的sel,传入值为B对象,同时返回值为NSComparisonResult
[arr sortUsingSelector:@selector(compareWithStu:)];
Student对象必须有一个自定义比较方法进行排序。
此方法必须有一个传入值(传入Student对象用以比对)和
一个返回值(NSComparisonResult类型)。
Student具体如下
.h
@interface Student : NSObject
@property (assign, nonatomic) NSInteger age;
/** 排序规则*/
- (NSComparisonResult)compareWithStu:(Student *)stu;
@end
.m
@implementation Student
/** 排序规则*/
- (NSComparisonResult)compareWithStu:(Student *)stu
{
//按照升续排列
if (self.age > stu.age)
{
return NSOrderedDescending;
}
else if (self.age == stu.age)
{
return NSOrderedSame;
}
else
{
return NSOrderedAscending;
}
}
@end
某次运行结果为
(
"age -> 10",
"age -> 12",
"age -> 12",
"age -> 18",
"age -> 19"
)
网友评论