排序一般分3种方法:
1.通过选择器selector(比较方法写在对象方法内部,比较整洁,常用)
2.通过比较器,block封装代码(跟选择器类似)
3.通过属性描述器(只能用于基本数据类型和字符串,有局限性,不常用)
方法名由(sortedArray)开头
#import <Foundation/Foundation.h>//------main.m
#import "LSDog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
LSDog *dog1 = [[LSDog alloc] init];
dog1.name = @"dog1";
dog1.age = 1;
LSDog *dog2 = [[LSDog alloc] init];
dog2.name = @"dog2";
dog2.age = 2;
LSDog *dog3 = [[LSDog alloc] init];
dog3.name = @"dog3";
dog3.age = 3;
NSArray *dogs = @[dog1,dog2,dog3];
//1.通过选择器
NSLog(@"%@",[dogs sortedArrayUsingSelector:@selector(compare:)]);
//2.通过比较器 (bolck数据类型) 通过封装代码来进行排序
NSLog(@"%@",[dogs sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
if (dog1.age == dog2.age) {
return [dog1.name compare:dog2.name];
}else if (dog1.age > dog2.age){
return NSOrderedDescending;//降序
}else{
return NSOrderedAscending;//升序
}
}]);
//3.通过属性描述器进行排序--(只能用于基本数据类型 和 字符串)sort:分类
//输入key 键,然后确定是否是升序
NSSortDescriptor *ds1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
NSSortDescriptor *ds2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
//把属性描述器放入数组
NSArray *arrds = @[ds1,ds2];
//使用分拣属性方法排序
NSLog(@"%@",[dogs sortedArrayUsingDescriptors:arrds]);
}
return 0;
}
#import <Foundation/Foundation.h>//------LSDog.h
@interface LSDog : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)int age;
@end
#import "LSDog.h"//------LSDog.m
@implementation LSDog
-(NSString *)description{
return [NSString stringWithFormat:@"name = %@,age = %d",_name,_age];
}
- (NSComparisonResult) compare:(LSDog *) other{ //需要重写compare方法
if (self.age == other.age) {
return [self.name compare:other.name];
}else if(self.age > other.age){
return NSOrderedDescending;
}else{
return NSOrderedAscending;
}
}
@end