关于NSArray的几种排序:
#利用数组的sortedArrayUsingComparator调用
NSComparator
当中NSComparator事实上就是一个返回NSComparisonResult的block。
typedef NSComparisonResult (^NSComparator)(id obj1,
id obj2); 当中obj1、obj2事实上是NSArray中的元素
resultArray = [arrayDic <span style="color:#009900;">sortedArrayUsingComparator:</span>^NSComparisonResult(id obj1, id obj2) {
NSNumber * number1 = [[obj1 allKeys] objectAtIndex:0];
NSNumber * number2 = [[obj2 allKeys] objectAtIndex:0];
NSComparisonResult result = [number1 compare:number2];
return result == NSOrderedAscending;
}];
#利用数组的sortedArrayUsingFunction 调用 相应方法customSort
NSInteger <span style="color:#ff9900;">sortByID</span>(id obj1, id obj2, void *context){
NSString *str1 =(NSString*) obj1; // ibj1 和 obj2 来自与你的数组中,事实上,个人认为是苹果自己实现了一个冒泡排序给大家使用
NSString *str2 =(NSString *) obj2;
if (str1.length < str2.length) {
<span style="white-space:pre"> </span>return NSOrderedDescending;
}
else if(str1.length == str2.length)
{
<span style="white-space:pre"> </span>return NSOrderedSame;
}
<span style="white-space:pre"> </span>return NSOrderedAscending;
}
NSArray *sortedArray =[arr sortedArrayUsingFunction:sortByID context:nil];
#利用数组的sortedArrayUsingSelector调用
相应的SEL的方法
注意selector的方法是对数组元素而言的方法,假如数据元素没有compare:方法。能够通过扩展数组元素的类添加对应的方法。
NSMutableArray *arrayDic = [NSMutableArray arrayWithObjects:
[NSDictionary dictionaryWithObjectsAndKeys:@"Obj0", [NSNumber numberWithInt:0], nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Obj5", [NSNumber numberWithInt:5], nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Obj2", [NSNumber numberWithInt:2], nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Obj3", [NSNumber numberWithInt:3], nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Obj1", [NSNumber numberWithInt:1], nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Obj4", [NSNumber numberWithInt:4], nil], nil];
#ifdef sortedArrayUsingSelector
resultArray = [arrayDic sortedArrayUsingSelector:@selector(compare:)];
由于数组中元素相应的是字典,所以对字典的类进行扩展
@implementation NSDictionary (extend)
- (NSComparisonResult)compare: (NSDictionary *)otherDictionary
{
NSNumber *number2 = [[otherDictionary allKeys] objectAtIndex:0];
NSDictionary *tempDictionary = (NSDictionary *)self;
NSNumber *number1 = [[tempDictionary allKeys] objectAtIndex:0];
NSComparisonResult result = [number1 compare:number2]; // return result == NSOrderedDescending; // 升序
return result == NSOrderedAscending; // 降序
}
#利用数组的sortUsingDescriptors调用NSSortDescriptor
NSSortDescriptor 能够简单的理解为 指定对象的某属性的比較描写叙述。
/**
* 能够非常方便的依据model对象中的某个属性进行排序
* sortDescriptor1 数组依据name进行升序排
* sortDescriptor2 数组依据age进行降序排
* 同一时候将两种sortDescriptor增加数组,是指先依照name排序,name同样的依照age排序
*/
Person *person1 = [[Person alloc] init];
[person1 setName:@"ABC"];
[person1 setAge:24]; Person *person2 = [[Person alloc] init];
[person2 setName:@"ACB"];
[person2 setAge:22]; Person *person3 = [[Person alloc] init];
[person3 setName:@"ABD"];
[person3 setAge:33];
NSMutableArray *array = [NSMutableArray arrayWithObjects:person1, person2, person3, nil];
NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor <span style="color:#ff0000;">sortDescriptorWithKey</span>:@"_name" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor <span style="color:#ff0000;">sortDescriptorWithKey</span>:@"_age" ascending:NO];
resultArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor1,sortDescriptor2,nil]];
for(NSInteger i = 0; i < [resultArray count]; i++)
{
NSLog(@"%@--------%d\n", [[resultArray objectAtIndex:i] name], [[resultArray objectAtIndex:i] age]);
}
关于NSArray的几种排序:的更多相关文章
- Object-c学习之路八(NSArray(数组)遍历和排序)
今天学习了NSArray的遍历和排序,现在在这里做一下总结: 遍历现在实现了四中方法: 排序大概有三中方法:(代码中都有注释) 关于对象的排序还是以Student和Book为例 每个Student持有 ...
- Objective-C实现常用的4种排序算法
OC实现的4种排序又来了! 4种排序分别是:快速排序.冒泡排序.选择排序.插入排序,其他的我就不写了,因为OC里的数组中不能存放基本数据类型,如int不能存放,只能放对象,所以所有的数据我用了NSNu ...
- iOS可视化动态绘制八种排序过程
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 几种排序算法的学习,利用Python和C实现
之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...
- ACM 一种排序
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- 秒杀9种排序算法(JavaScript版)
一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...
- nyoj 8 一种排序
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)
每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
随机推荐
- JSP 网页格式判定执行哪一块html
JSP 网页格式判定执行哪一块html <!-- start --> <td height="166" colspan="3&q ...
- HTML+CSS - 搜索 And 高级搜索
- linux命令:du,看文件大小
du -s698 . (698字节)From <http://jingyan.baidu.com/article/a17d52855c10bf8098c8f2c9.html>
- 基于visual Studio2013解决C语言竞赛题之1058打印数字
题目 解决代码及点评 /************************************************************************/ /* 58 ...
- Swift - 给表格TableView添加页眉和页脚
UITableView具有var tableHeaderView:UIView?属性和var tableFooterView:UIView?属性,可以通过给其赋值来创建列表TableView的页眉和页 ...
- MFC如何生成一个可串行化的类
一.MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程. (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构 ...
- wp实例开发精品文章源码推荐
WP8 启动媒体应用 这个示例演示了如何选择正确的msAudioCategory类别的音像(AV)流来配置它作为一个音频播放流.具体地说,这个示例执行以下操作:启动一个媒体应用与“媒体 ...
- android.graphics包中的一些类的使用
游戏编程相关参考 Matrix学习系列: http://www.moandroid.com/?p=1781 Android画图学习总结系列: http://www.moandroid.com/?p=7 ...
- 在Qt中使用ActiveX控件
Qt的windows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt中使用ActiveX控件,并且也开发基于Qt的ActiveX控件.ActiveQt包含了两个组件QA ...
- 所有CM_消息的说明
这些CM消息,居然在Delphi的帮助里是没有任何说明的,真是昏倒.意外在高手的书里找到了所有说明,说明如下: Message Constant Value Description cm_Base $ ...