Objective-C之NSArray(数组)默认排序与自定义排序
在讲OC中数组的排序之前我先上一段代码,它是简单数组排序的一种方法(也就是元素是字符串或者数据的数组,因为后面要讲元素为类的数组排序)
代码1:
NSArray *sortArr4 = [sortArr3 sortedArrayUsingComparator:^NSComparisonResult/*代码块返回值类型*/(id obj1, id obj2)
{
return [obj1 compare:obj2];//根据比较结果,如果结果是1,则交换
}];
NSLog(@"%@",sortArr4);
上面的程序中定义的一个sortArr4的数组,它来自于sortArr3的排序结果(注意:是升序)。第三行中的“obj1 compare:obj2”,还记得compare:是个什么东东吗?他是我们数组(NSString)那一节中的一个字符串比较方法,如下我把之前的代码复制过来了:
代码2:
NSComparisonResult/*枚举类型*/ result = [@"CBA" compare:@"abc" ] ;
比较之后返回了一个名字为NSComparisonResult的枚举类型(取值-1(小于),0(等于),1(大于)),快看,它跟代码1中的“:^”后的名字是一样的。为什么呢?因为这必须要一样。compare:比较之后的返回值传向了NSArray的一个方法“sortedArrayUsingComparator:”,它内部机制是我们看不到的,因为OC代码不开源。我们只知道它获得了值1时,就是compare:比较返回值为1时,会把数组元素进行交换,应该类似于C语言中的冒泡排序,我估计它内部有循环机制,不然循环一次的位置调换是无法正确排序的。
好了,上面的代码就是字符串排序的作用,大家有没有注意到"[]"阔的范围把整个函数都阔住了。其实,它不算是个函数,“{}”里面放的只是一个我们自定义的能返回NSComparisonResult的枚举类型范围的代码。我们也可以通过if.else来实现,只是那样不利于字符串的比较,假如数组里面是数据,那样用if.else就简单多了。
下面进入正题:
代码3
NSArray *sortArr = @[@"",@"",@"",@""];
NSArray *sortArr1 = [sortArr sortedArrayUsingSelector/*排序数组使用选择器*/:@selector(compare:)];
// @selector是关键字(告诉编译器要执行一个方法),后面跟的是函数或自定义函数,总之就是具有比较功能,能返回NSComparisonResult类型的函数
//compare:返回调用结果比较:不带任何选项的选择:范围:和接收机的全部范围。
NSLog(@"%@",sortArr1); // IOS提供一个sortedArrayUsingSelector ()函数,用于对字符串数组进行排序,方法会在排序后返回一个新的数组。
//[array sortedArrayUsingSelector (@selector(xxxx:))];
//xxxx:方法需要你自己根据实际情况设定排序方式。有默认的排序方法 compare :
代码注释中已将讲了“compare:”是一个方法,它也可以我们自己定义,当数组元素比较复杂时,“compare:”无法满足比较。例如一个元素为学生对象的数组,数组每个元素都包含了学生的年龄,性别,分数,姓名等等,那用“compare:”怎么比?是没办法比得。所以就需要我们自定义方法,别的地方都不用改变,只需要把“compare:”改为我们自定义的方法就行了。那么这个方法怎么定义呢?首先,我们要明确的知道,这个方法有形参,形参应该与数组元素同等类型,因为要对元素(类的对象)的部分成员进行比较;有返回值并且是NSComparisonResult类型的返回值。下面看代码:
代码4:
@interface Student : NSObject @property(nonatomic,strong)NSString *name;
@property(nonatomic,assign) int age; -(NSComparisonResult)compareWithName:(Student *)stu;//比较name的方法,返回Foundation框架方法的够处理的NSComparisonResult类型
-(NSComparisonResult)compareWithAge:(Student *)stu;//比较age的方法,返回Foundation框架方法的够处理的NSComparisonResult类型 @end
代码4是定义Student类的.h文件,首先声明了名字和年龄的属性,后面声明了前面讲到的需要取代替"compare:"的一个比较方法,就是自定义方法。代码5中是该方法的实现部分。
代码5:
@implementation Student
-(NSComparisonResult)compareWithName:(Student *)stu
{
return [self.name compare:stu.name];
}
-(NSComparisonResult)compareWithAge:(Student *)stu
{
if( self.age < stu.age ) return -;
else if( self.age == stu.age ) return ;
else return ;
}
-(NSString *)description//方法重写
{
return [NSString stringWithFormat:@"%@,%i",_name,_age];
}
@end
注意注释处的方法重写部分,假如利用代码6中的17、18行输出方法会输出地址。所以在这里重写了description(描述方法),就是把类对象中的年龄和姓名以字符串形式拼接起来,这样的话可以直接对数组进行打印输出。
代码6:
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Student *student1 = [[Student alloc] init];
Student *student2 = [[Student alloc] init];
Student *student3 = [[Student alloc] init];
student1.name = @"zhangsan";
student1.age = ;
student2.name = @"lisi";
student2.age = ;
student3.name = @"wangwu";
student3.age = ;
NSArray *myAray = @[student1,student2,student3];
NSArray *meToArray = [myAray sortedArrayUsingSelector:@selector(compareWithName:)];
NSArray *comeToArray = [myAray sortedArrayUsingSelector:@selector(compareWithAge:)];
// NSLog(@"%@",meToArray);//打印的是地址
// NSLog(@"%@",comeToArray);
NSLog(@"%@",meToArray);//打印的是地址
NSLog(@"%@",comeToArray); }
return ;
}
//第二种方法,描述器排序
//先创建排序条件:key对应要排序的对象的属性名字
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES];
//将描述条件放入排序数组(用于盛放排序条件,可以多个)
//先按成绩升序排序,成绩一样的情况,再按年龄升序排序
NSArray *desArr = @[sort,sort1];
NSArray *sortArr1 = [myAray sortedArrayUsingDescriptors:desArr];
NSLog(@"--->%@",sortArr1);
一、 NSMutableArray *sss = [NSMutableArray arrayWithCapacity:0];
NSArray *ddd = @[@"12323456",@"155",@"8588" ];
[sss addObjectsFromArray:ddd];
[sss removeObjectAtIndex:0];
二、 NSMutableArray *sss = [NSMutableArray arrayWithCapacity:0];
NSArray *ddd = @[@"12323456",@"155",@"8588" ];
[sss copy];
[sss removeObjectAtIndex:0];
三、 NSMutableArray *sss = [NSMutableArray arrayWithCapacity:0];
NSArray *ddd = @[@"12323456",@"155",@"8588" ];
[sss arrayByAddingObjectsFromArray:ddd];
[sss removeObjectAtIndex:0];
其中只有第一个程序可以正常运行
Objective-C之NSArray(数组)默认排序与自定义排序的更多相关文章
- MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序
MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3中比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...
- map的默认排序和自定义排序
STL的容器map为我们处理有序key-value形式数据提供了非常大的便利,由于内部红黑树结构的存储,查找的时间复杂度为O(log2N). 一般而言,使用map的时候直接采取map<typen ...
- EasyUI 数据网格 - 设置排序并自定义排序
数据网格(DataGrid)的所有列可以通过点击列表头来排序.您可以定义哪列可以排序.默认的,列是不能排序的,除非您设置 sortable 属性为 true. 当排序时,数据网格(DataGrid)将 ...
- mysql排序的中文首字母排序和自定义排序
select * FROM organ_new where city_code = 'SZ0755' and organ_type = 'H' and state = '1' ORDER BY FIE ...
- hdu 1263 水果 结构的排序+sort自定义排序
水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- MySQL中自定义排序
在开发时候,我们经常使用的是默认的排序规则,但在某些特殊情况下,通过指定顺序来进行排序 -- fileld自定义排序时,应该是非主键的,否则主键是无效 SELECT * FROM customer W ...
- Python自定义排序及我实际遇到的一些题目实例
写在前面,本文主要介绍Python基础排序和自定义排序的一些规则,如果都比较熟悉,可以直接翻到第三节,看下实际的笔试面试题中关于自定义排序的应用. 一.基础排序 排序是比较基础的算法,与很多语言一样, ...
- 16.Object-C--NSArray数组的排序
今天我来总结一下NSArray数组的排序方式. NSArray数组的排序有三种方式: 1.简单排序(sortedArrayUsingSelector:) 2.利用block语法(sortedArray ...
- Object-c学习之路八(NSArray(数组)遍历和排序)
今天学习了NSArray的遍历和排序,现在在这里做一下总结: 遍历现在实现了四中方法: 排序大概有三中方法:(代码中都有注释) 关于对象的排序还是以Student和Book为例 每个Student持有 ...
随机推荐
- [BZOJ1116][Poi2008]LCO(并查集)
题目:http://hzwer.com/3010.html 分析:注意这里无向边是对入度没有贡献的. 那么对于一个n个点的连通块而言,如果它是一颗树(n-1条边),那么把所有边全部从某个根开始向下指, ...
- 2016 5.03开始记录我的it学习。
好多谢立成师兄给我这个网址,我发现博客园不仅仅可以随笔记载很多东西,还是一个资源丰富的网站,接下来的四年我会用心去记录这些学习的点滴.
- 网页设计:Meta标签详解
很多人忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧! META标签是HTML语言HEAD区的一个辅 ...
- vijos-1003等价表达式
明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和 ...
- Asp.Net Form验证不通过,重复登录
问题产生根源: 当然,其实应该需要保持线上所有机器环境一致!可是,写了一个小程序.使用的是4.5,aysnc/await实在太好用了,真心不想把代码修改回去. so,动了念头,在这台服务器上装个4.5 ...
- IE6和IE7中<a>标签宽高设置无效的问题
昨天写了一个引导界面, 发现界面中的IE67存在一个问题, 在某些情况下, A锚链接如果设置了宽高,而且position:absolute的情况下, A标签的宽高无效, 至于总体的效果, 因为这个A ...
- 概率DP light oj 1030
t组数据 n块黄金 到这里就捡起来 出发点1 到n结束 点+位置>n 重掷一次 dp[i] 代表到这里的概率 dp[i]=(dp[i-1]+dp[i-2]... )/6 如果满6个的话 否则 ...
- Docker指定multiple Insecure registry的方法
Docker如果需要从非SSL源管理镜像,需要配置Docker配置文件的insecury-registry参数,一般在如下位置修改其配置文件: * /etc/sysconfig/docker * /e ...
- awk打印出当前行的上一行
#awk '/B/{print a;}{a=$0}' a.txt A # cat a.txt A BCDE
- c# 监听文件夹动作
static FileSystemWatcher watcher = new FileSystemWatcher(); /// <summary> /// 初始化监听 ...