日常项目中偶尔会有用到要对接收到数据进行排序操作。如果采用遍历等方法来进行不免写大量代码而且复用性很低,在这里记录下自己用NSSortDescriptor 进行排序的过程和一些总结。
什么是NSSortDescriptor :简单的说NSSortDescriptor就是去创建一个排序条件,初始化中需要指定按照数组中对象通过什么属性进行排序,升序或者降序。可以理解为一个排序规则的描述者。
简单使用:如下对一个包含元素a,b,c,x,y,z的数组进行排序
首先初始化原始数据的数组:
NSArray *dataArray = [NSArray arrayWithObjects:@"a", @"c", @"z", @"b", @"x", @"y", nil];
下一步:通过NSSortDescriptor创建一个排序条件,初始化中需要指定按照数组中对象的什么属性进行排序,升序或者降序
//这里只是简单排序,所以key 值为nil
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES];
//ascending:YES 代表升序 如果为NO 代表降序
NSArray *descriptors = [NSArray arrayWithObject:descriptor];
单个排序条件参数的话也可以这么写:
NSArray * descriptors = [array1 sortedArrayUsingDescriptors: @[[[NSSortDescriptor alloc] initWithKey:nil
ascending:YES]]];
第三部:调用方法
NSArray *resultArray = [dataArray sortedArrayUsingDescriptors:descriptors];
NSLog(@"%@", resultArray);
上例输出结果:
这里需要注意:
sortedArrayUsingDescriptors方法需要传入一个NSArray,也说明了如果有多个排序条件的话可以将多个条件加入到数组中去进行排序;
举例一个学生类,学生有属性年龄,姓名,考试成绩,对其进行排序
Student *s1 = [[Student alloc] initWithName:@"zhangsna" age:@"19" score:@"90"];
Student *s2 = [[Student alloc] initWithName:@"lisi" age:@"20" score:@"87"];
Student *s3 = [[Student alloc] initWithName:@"wangwu" age:@"21" score:@"93"];
NSArray *student = @[s1, s2, s3];
NSSortDescriptor *age = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];//ascending:YES 代表升序 如果为NO 代表降序
NSSortDescriptor *score=[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES];
NSArray *descriptors = [NSArray arrayWithObjects: age, score];//学生先按关键字age(年龄)再按score(成绩)排序
student = [[student sortedArrayUsingDescriptors: descriptors];
// NSArray 使用sortedArrayUsingDescriptors,返回排序好的数组。
// NSMutableArray可以直接使用sortUsingDescriptors,对数组本身排序。