有时我们在NSMutableArray中存的是网络请求返回的数据,而每一个元素又是一个NSDictionary,如果这时候需要把数组中的元素按照每个元素字典中某一个key来排序,那么我们可以利用OC中的类:NSSortDescriptor来快速实现需求。这个是oc官方的排序方法,使用起来非常方便
以下就通过一个栗子来演示以下,可直接拷贝代码到项目里面运行
//通过对可变数组里面的字典的某个key值进行排序
NSMutableArray *dicArray = [NSMutableArray array];
for (int i = 0; i<5; i++) {
NSInteger x = arc4random() % 100;
[dicArray addObject:@{@"num":[NSNumber numberWithInteger:x]}];
}
for (NSDictionary *dic in dicArray) {
NSLog(@"未排序之前>>>>>>%@",dic[@"num"]);
}
NSSortDescriptor *distanceDescriptor = [[NSSortDescriptor alloc] initWithKey:@"num" ascending:YES];
NSArray *descriptors = [NSArray arrayWithObjects:distanceDescriptor,nil];
[dicArray sortUsingDescriptors:descriptors];
for (NSDictionary *dict in dicArray) {
NSLog(@"排序后>>>>>>%@",dict[@"num"]);
}
除了对number数据类型进行排序之外,如果数组对象是NSString类型的,也就是对字符串数组进行排序,那么就更简单了,sortDescriptorWithKey直接指定为nil就搞定了。
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES];
NSArray *descriptors = [NSArray arrayWithObject:descriptor];
NSArray *myDataArray = [NSArray arrayWithObjects:@"what", @"xero", @"highligth", @"mountain", @"Victory", @"Balance", nil];
NSArray *resultArray = [myDataArray sortedArrayUsingDescriptors:descriptors];
NSLog(@"%@", resultArray);
这里需要注意一下:
NSArray 使用
sortedArrayUsingDescriptors
,返回排序好的数组;NSMutableArray可以直接使用
sortUsingDescriptors
,对数组本身排序。
这里我们不难发现sortedArrayUsingDescriptors和sortUsingDescriptors这两个方法都是需要传一个Descriptors数组的,也就是说可以使用多个排序参数,非常好用!
再举个栗子,比如说User有一个属性叫做image,而image又有个属性叫timestamp,如果要根据User的image关系的timestamp排序,那么NSSortDescriptor传的key值应该是@“image.timestamp”
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"image.timestamp" ascending:YES];
[userArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];