数组排序-Objectivec
已有15次阅读 ,共0个评论
摘要:
总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors:
大体上,OC中常用的数组排序有以下几种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors:。
1、简单排序(sortedArrayUsingSelector:)
如果只是对字符串的排序,可以利用sortedArrayUsingSelector:方法就可以了,代码如下
//简单排序
void sortArray1(){
NSArray *array = [NSArray arrayWithObjects:@"abc",@"456",@"123",@"789",@"ef", nil];
NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"排序后:%@",sortedArray);
}
当然,除了利用字符串自带的compare:方法,也可以自己写compare:方法,进行对象的比较;如下:
首先是新建了Person类,实现方法如下(头文件就省了):
#import "Person.h"
@implementation Person //直接实现静态方法,获取带有name和age的Person对象
+(Person *)personWithAge:(int) age withName:(NSString *)name{
Person *person = [[Person alloc] init];
person.age = age;
person.name = name;
return person;
} //自定义排序方法
-(NSComparisonResult)comparePerson:(Person *)person{
//默认按年龄排序
NSComparisonResult result = [[NSNumber numberWithInt:person.age] compare:[NSNumber numberWithInt:self.age]];//注意:基本数据类型要进行数据转换
//如果年龄一样,就按照名字排序
if (result == NSOrderedSame) {
result = [self.name compare:person.name];
}
return result;
} @end
主函数代码如下:
void sortArray2(){
Person *p1 = [Person personWithAge:23 withName:@"zhangsan"];
Person *p2 = [Person personWithAge:21 withName:@"lisi"];
Person *p3 = [Person personWithAge:24 withName:@"wangwu"];
Person *p4 = [Person personWithAge:24 withName:@"liwu"];
Person *p5 = [Person personWithAge:20 withName:@"liwu"];
NSArray *array = [NSArray arrayWithObjects:p1,p2,p3,p4,p5, nil];
NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(comparePerson:)];
NSLog(@"排序后:%@",sortedArray);
}
2、利用block语法(sortedArrayUsingComparator:)
苹果官方提供了block语法,比较方便。其中数组排序可以用sortedArrayUsingComparator:方法,代码如下:
void sortArray3(){
NSArray *array = [NSArray arrayWithObjects:@"1bc",@"4b6",@"123",@"789",@"3ef", nil];
NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//这里的代码可以参照上面compare:默认的排序方法,也可以把自定义的方法写在这里,给对象排序
NSComparisonResult result = [obj1 compare:obj2];
return result;
}];
NSLog(@"排序后:%@",sortedArray);
}
3、高级排序(sortedArrayUsingDescriptors:)
如果是这样一种情况呢?Person类里有另外一个类的变量,比如说Person类除了name,age变量,还有一辆车Car类型,Car类里有个name属性。对Person对象进行排序,有这样的要求:按照Car的name排序,如果是同一辆车,也就是Car的name相同,那么再按照年龄进行排序,如果年龄也相同,最后按照Person的name进行排序。
上面这样就要使用第三种方法,利用排序描述器,不多说,有兴趣可以看看API介绍。代码如下:
首先写个Car类,实现类Car.m代码如下:
#import "Car.h"
@implementation Car +(Car *)initWithName:(NSString *)name{
Car *car = [Car alloc] init];
car.name = name;
return car;
} @end
然后改写Person类,实现类Person.m代码如下:
#import "Person.h"
#import "Car.h"
@implementation Person +(Person *)personWithAge:(int)age withName:(NSString *)name withCar:(Car *)car{
Person *person = [[Person alloc] init];
person.age = age;
person.name = name;
person.car = car;
return person;
} //这里重写description方法,用于最后测试排序结果显示
-(NSString *)description{
return [NSString stringWithFormat:@"age is %zi , name is %@, car is %@",_age,_name,_car.name];
} @end
主函数代码如下:
void sortArray4(){
//首先来3辆车,分别是奥迪、劳斯莱斯、宝马
Car *car1 = [Car initWithName:@"Audio"];
Car *car2 = [Car initWithName:@"Rolls-Royce"];
Car *car3 = [Car initWithName:@"BMW"];
//再来5个Person,每人送辆车,分别为car2、car1、car1、car3、car2
Person *p1 = [Person personWithAge:23 withName:@"zhangsan" withCar:car2];
Person *p2 = [Person personWithAge:21 withName:@"zhangsan" withCar:car1];
Person *p3 = [Person personWithAge:24 withName:@"lisi" withCar:car1];
Person *p4 = [Person personWithAge:23 withName:@"wangwu" withCar:car3];
Person *p5 = [Person personWithAge:23 withName:@"wangwu" withCar:car2];
//加入数组
NSArray *array = [NSArray arrayWithObjects:p1,p2,p3,p4,p5, nil];
//构建排序描述器
NSSortDescriptor *carNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"car.name" ascending:YES];
NSSortDescriptor *personNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSSortDescriptor *personAgeDesc = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
//把排序描述器放进数组里,放入的顺序就是你想要排序的顺序
//我这里是:首先按照年龄排序,然后是车的名字,最后是按照人的名字
NSArray *descriptorArray = [NSArray arrayWithObjects:personAgeDesc,carNameDesc,personNameDesc, nil];
NSArray *sortedArray = [array sortedArrayUsingDescriptors: descriptorArray];
NSLog(@"%@",sortedArray);
}
结果如下:

从结果看出,先按照age排序,如果age相同,按照car排序,如果car相同,按照name排序。
(注意:上面两种排序方法要想实现字符串显示,请重写description方法)
数组排序-Objectivec的更多相关文章
- Objective C中数组排序几种情况的总结
总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 数组排 ...
- 数组对象(NSArray和NSMutableArrray)
Objective-C中除了可以使用C中的基本数组外,如int[5],char word[] ={‘a’,'b’,'c’};Foundation还提供了NSArray类.Foundation是有序的对 ...
- Objective-C中Block语法、Block使用以及通过Block实现数组排序
Block:语法块,本质上是匿名函数(没有名称的函数) 标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数 在C++.JS.Swift等语言有类似语法,叫做闭包 Block语法和C语言里的 ...
- iOS开发系列—Objective-C之Foundation框架
概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...
- Objective-C的基础语法总结
1.NSLog(@“hello world!”);//打印语句的函数,需要打印的字符串放在@之后. NSLog(@“are %d and %d different?%@”,4,4,@”YES”); 2 ...
- Objective-C如何使用对象集合学习系列之一
本章介绍如何通过 Foundation 框架使用 Objective-C 处理数组与字典.本章内容: ● 使用 NSArray 与 NSMutableArray 创建数组 ● 在数组中添加.删除与 ...
- Objective-C官方文档 值和集合
版权声明:原创作品,谢绝转载!否则将追究法律责任. 尽管Objective-c是一个面向对象的语言,是C语言的超集,这意味着你可以用任何标准的C标量(非对象)像int,float,和char在Obje ...
- OC:数组排序、时间格式化字符串
数组排序 //不可变数组的排序 NSArray * arr = [NSArray arrayWithObjects:@"hellow", @"lanou", @ ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
随机推荐
- VC实现卡拉OK字幕叠加
一. GDI编程基础 字幕叠加,应当是属于图形.图像处理的范畴.在Windows平台上,图形.图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口).GDI是 ...
- BZOJ 1177 [Apio2009]Oil(递推)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1177 [题目大意] 给出一个矩阵,从中选出3个k*k且不相交的矩阵,使得其总和最大 [ ...
- unity3d插件Daikon Forge GUI 中文教程-5-高级控件listbox和progress bar的使用
(游戏蛮牛首发)大家好我是孙广东.官网提供了专业的视频教程http://www.daikonforge.com/dfgui/tutorials/,只是是在youtube上,要观看是须要FQ的. 只是教 ...
- jQuery 插件 flexslider 初步使用
发现了个不错的 jQuery 幻灯片插件 flexslider,有 接近 3000 Star,应该说是很靠谱的,下面是简单使用教程. 引入代码 所有代码都可以在 flexlslider 的 Githu ...
- 【iOS】Mapkit的使用:地图显示、定位、大头针、气泡等
转自:http://blog.csdn.net/dolacmeng/article/details/46594839 以前做项目用高德地图SDK,需要注册账号和AppID,然后下载SDK集成到项目中, ...
- HDU3496-Watch The Movie
描述: New semester is coming, and DuoDuo has to go to school tomorrow. She decides to have fun tonight ...
- cocos2dx中Action汇总
本文由qinning199原创, 转载请注明:http://www.cocos2dx.net/?p=119 今天总结一下cocos2dx中的一些Action动作,其中To表示到达某个点,而By表示偏移 ...
- C文件操作(转载)
/*1.文件的打开(fopen函数)fopen函数用来打开一个文件,其调用的一般形式为:文件指针=fopen(文件名,文件操作方式):例如:FILE *fpinfpin=fopen("c:\ ...
- mybatis一对一关联表查询
先创建一个表 CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name ) ); CREATE TABLE class( c_ ...
- 国内BI工具/报表工具厂商简介
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...