对于在app中开发,网络数据的排序,大致的思路有两种:
1.客户端每次发出新的请求,服务器在数据库排好序然后直接给客户端一个排好序的数组即可
2.为了减少请求的次数和服务器的压力排序的事可以交给客户端来做,目前的智能机的硬件能胜任这个事情
下面提供一个可以直接使用的,按照一个model或者实体 类Entity的一个属性(property)组成的一个数组进行升序和降序排序的方法,可以直接使用
/* 静态方法:sortByValue 功能:对model/Entity数组按model的属性进行升序或者降序排序 ifIncrease:是否未升序,YES升序,NO降序 sortProperty:需要的model的属性用来排序,例如一个Student对象的Grade成绩来排序
返回值:一个新的数组,当你得到这个排序的数组之后,只需要 self.tableView reloadData即可 说明:每一个参数都为必填,使用自定义的block来实现排序的规则
*/ + (NSArray *)sortByValue:(NSArray *)array ifIncrease:(BOOL)inc sortProperty:(NSString *)property { return [array sortedArrayUsingComparator:^NSComparisonResult(NSObject *obj1, NSObject* obj2) { int a=[[obj1 valueForKey:property] intValue]; int b=[[obj2 valueForKey:property] intValue]; if (inc)//升序 { if (a<b) return -1;//NSComparisonResult枚举中对应的值,代表升序(a-b<0) else return 1;//(a-b>0)降序 } else//降序 { if (a<b) return 1; else return -1; } }]; }
测试Demo:
一个Model类,例如一个人,有工资salary,和grade分数,idNum工号
一个Utils类,封装的静态方法,便于以后的多次调用
ViewController类,系统创建
代码如下:
// 实体类/Model类有若干属性 // Model.h // SortByValue // // Created by on 15/1/16. // Copyright (c) 2015年 . All rights reserved. // #import <Foundation/Foundation.h> @interface Model : NSObject @property(strong,nonatomic)NSString *grade;//成绩 @property(strong,nonatomic)NSString *salary;//工资 @property(strong,nonatomic)NSString *idNum;//工号 - (instancetype)initWithAll:(NSString *)grade andSalary:(NSString *)salary andIdNum:(NSString *)idNum; @end
// // Model.m // SortByValue // // Created by on 15/1/16. // Copyright (c) 2015年 . All rights reserved. // #import "Model.h" @implementation Model
//实现自己的初始化方法 - (instancetype)initWithAll:(NSString *)grade andSalary:(NSString *)salary andIdNum:(NSString *)idNum { self = [super init]; if (self) { _grade=grade; _salary=salary; _idNum=idNum; } return self; } - (NSString *)description //类似于java的toString发,打印这个Model对象即会调用这个方法 { NSString *str=[NSString stringWithFormat:@"grade=%@,salary=%@,idNum=%@",_grade,_salary,_idNum]; NSLog(@"grade=%@,salary=%@,idNum=%@",_grade,_salary,_idNum); return str; } @end
//工具类,经常需要被调用 // Utils.h // SortByValue // // Created by yb on 15/1/17. // Copyright (c) 2015年 . All rights reserved. // #import <Foundation/Foundation.h> @interface Utils : NSObject + (NSArray *)sortByValue:(NSArray *)array ifIncrease:(BOOL)inc sortProperty:(NSString *)property; @end
//工具类的实现 // Utils.m // SortByValue // // Created by on 15/1/17. // Copyright (c) 2015年 . All rights reserved. // #import "Utils.h" @implementation Utils /* 静态方法:sortByValue 功能:对model数组按model的属性进行升序或者降序排序 ifIncrease:是否未升序,YES升序,NO降序 sortProperty:需要的model的属性用来排序 说明:每一个参数都为必填 */ + (NSArray *)sortByValue:(NSArray *)array ifIncrease:(BOOL)inc sortProperty:(NSString *)property { return [array sortedArrayUsingComparator:^NSComparisonResult(NSObject *obj1, NSObject* obj2) { int a=[[obj1 valueForKey:property] intValue]; int b=[[obj2 valueForKey:property] intValue]; if (inc) { if (a<b) return -1; else return 1; } else { if (a<b) return 1; else return -1; } }]; } @end
//测试类,系统创建,.h // ViewController.m // SortByValue // // Created by on 15/1/16. // Copyright (c) 2015年 . All rights reserved. // #import "ViewController.h" #import "Model.h" #import "Utils.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *arr=[[NSMutableArray alloc]initWithCapacity:10]; Model *model1=[[Model alloc]initWithAll:@"100" andSalary:@"10000" andIdNum:@"1111"]; Model *model2=[[Model alloc]initWithAll:@"99" andSalary:@"20000" andIdNum:@"3111"]; Model *model3=[[Model alloc]initWithAll:@"101" andSalary:@"10000" andIdNum:@"1110"]; Model *model4=[[Model alloc]initWithAll:@"77" andSalary:@"40000" andIdNum:@"1101"]; [arr addObject:model1]; [arr addObject:model2]; [arr addObject:model3]; [arr addObject:model4]; NSLog(@"排序之前的顺序是:"); for (Model*model in arr) { NSLog(@"%@",model); } NSArray *arr1=[Utils sortByValue:arr ifIncrease:NO sortProperty:@"salary"]; NSLog(@"<span style="font-family: Arial, Helvetica, sans-serif;">salary</span>排序之后的顺序是:"); for (Model*model in arr1) { NSLog(@"%@",model); } } @end
运行效果:
2015-01-17 11:44:35.428 SortByValue[24580:1627720] 排序之前的顺序是: 2015-01-17 11:44:35.428 SortByValue[24580:1627720] grade=100,salary=10000,idNum=1111 2015-01-17 11:44:35.428 SortByValue[24580:1627720] grade=100,salary=10000,idNum=1111 2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=99,salary=20000,idNum=3111 2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=99,salary=20000,idNum=3111 2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=101,salary=10000,idNum=1110 2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=101,salary=10000,idNum=1110 2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=77,salary=40000,idNum=1101 2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=77,salary=40000,idNum=1101 2015-01-17 11:44:35.429 SortByValue[24580:1627720] 排序之后的顺序是: 2015-01-17 11:44:35.429 SortByValue[24580:1627720] grade=77,salary=40000,idNum=1101 2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=77,salary=40000,idNum=1101 2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=99,salary=20000,idNum=3111 2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=99,salary=20000,idNum=3111 2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=100,salary=10000,idNum=1111 2015-01-17 11:44:35.430 SortByValue[24580:1627720] grade=100,salary=10000,idNum=1111 2015-01-17 11:44:35.517 SortByValue[24580:1627720] grade=101,salary=10000,idNum=1110 2015-01-17 11:44:35.517 SortByValue[24580:1627720] grade=101,salary=10000,idNum=1110