简单数组排序
数字
, 字符串
数组的排序相对来说非常简单.
直接使用 API
对如下数组排序:
1
NSArray *nums = @[@7, @2, @8, @3, @9, @6, @5];
升序排序:
1
2
3
4
[nums sortUsingComparator:^NSComparisonResult(NSNumber *obj1, NSNumber *obj2) {
// 默认升序排序, 降序排序只需颠倒 compare: 方法返回的 NSComparisonResult 枚举即可
return [obj1 compare:obj2];
}];
输出结果:
1
(2, 3, 5, 6, 7, 8, 9)
复杂对象数组的排序
以对 Person
实例对象数组排序为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Person 类头文件
@interface Person : NSObject
@property (nonatomic, copy) NSString *name; // 姓名
@property (nonatomic, assign) NSInteger age; // 年龄
@property (nonatomic, assign) CGFloat height; // 身高
@property (nonatomic, assign) CGFloat weight; // 体重
@end
// 实现部分
@implementation Person
// 重写 description 方法方便查看输出内从
- (NSString *)description {
return [NSString stringWithFormat:@"%@: %ld岁 %.0fcm %.0fkg", _name, _age, _height, _weight];;
}
@end
现在要对以下数组进行排序:
1
2
3
4
5
6
7
NSArray *persons =
@[[Person persionWithName:@"张三" age:16 height:178 weight:69],
[Person persionWithName:@"李四" age:28 height:173 weight:66],
[Person persionWithName:@"王五" age:21 height:185 weight:73],
[Person persionWithName:@"赵六" age:21 height:159 weight:51],
[Person persionWithName:@"孙七" age:18 height:165 weight:56],
];
目标:
- 根据年龄升序进行数组排序.
- 根据年龄降序, 同龄的再根据身高降序排序.
- …
一般做法:
1. 根据年龄升序进行数组排序.
1
2
3
4
[persons sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
// 此处使用 '>' 和 '<' 决定了升序还是降序
return obj1.age > obj2.age;
}];
输出结果:
1
2
3
4
5
6
7
(
"张三: 16岁 178cm 69kg",
"赵六: 18岁 165cm 56kg",
"王五: 21岁 159cm 51kg",
"孙七: 21岁 185cm 73kg",
"李四: 28岁 173cm 66kg"
)
2. 根据年龄降序, 同龄的再根据身高降序排序.
1
2
3
4
5
6
7
[persons sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
// 如果年龄相同, 直接对比 '身高' 即可
if (obj1.age == obj2.age) {
return obj1.height < obj2.height;
}
return obj1.age > obj2.age;
}];
排序结果:
1
2
3
4
5
6
7
(
"张三: 16岁 178cm 69kg",
"赵六: 18岁 165cm 56kg",
"孙七: 21岁 185cm 73kg",
"王五: 21岁 159cm 51kg",
"李四: 28岁 173cm 66kg"
)
使用 NSSortDescriptor 进行排序
NSSortDescriptor
是苹果提供的一个排序规则描述类. 我们可以通过他对数组内对象的某一个属性定义排序规则.
NSArray
的 sortedArrayUsingDescriptors:
方法传入的是一个 数组
, 说明此处可以直接对数添加多个排序规则.
1. 根据年龄升序进行数组排序.
1
省略, 直接看排序 2.
2. 根据年龄降序, 同龄的再根据身高降序排序.
1
2
3
4
5
6
// 定义 age 属性排序规则
NSSortDescriptor *ageDesc = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
// 定义 height 属性排序规则
NSSortDescriptor *hegDesc = [[NSSortDescriptor alloc] initWithKey:@"height" ascending:NO];
// 通过排序规则对属性进行排序, NSSortDescriptor 对象在数组的顺序就是排序的优先级顺序
[persons sortedArrayUsingDescriptors:@[ageDesc, hegDesc]];
排序结果:
1
2
3
4
5
6
7
(
"张三: 16岁 178cm 69kg",
"赵六: 18岁 165cm 56kg",
"孙七: 21岁 185cm 73kg",
"王五: 21岁 159cm 51kg",
"李四: 28岁 173cm 66kg"
)