关于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.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
随机推荐
- 6.6.2 自己主动泛型化(automatic generalization)
6.6.2 自己主动泛型化(automatic generalization) 在这一章,我们已经实现了几个 F# 的高阶函数.也看到了在 F# 和 C# 中并排的实现.F# 实现的非常重要方面,是我 ...
- C# - 接口的继承
代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- javax.servlet.http.HttpServletRequest;
错误提示是没有引入javax.servlet.http.HttpServletRequest所在的包,编译错误. 这么添加: 项目-->右键-->properties-->java ...
- Jquery Mobile转场特效之slide | 小小iPhone开发
Jquery Mobile转场特效之slide | 小小iPhone开发 2012 Jquery Mobile转场特效之slide 作者:小小 发布:2012-12-12 14:03 分类:j ...
- POJ - 1422 Air Raid 二分图最大匹配
题目大意:有n个点,m条单向线段.如今问要从几个点出发才干遍历到全部的点 解题思路:二分图最大匹配,仅仅要一条匹配,就表示两个点联通,两个点联通仅仅须要选取当中一个点就可以,所以有多少条匹配.就能够减 ...
- 开源JDBC工具类DbUtils
本篇将会详细地介绍Apache公司的JDBC帮助工具类DbUtils以及如何使用.在上一篇中我们已经通过将以前对dao层使用JDBC操作数据库的冗余代码进行了简易封装形成自己的简单工具类JdbcUti ...
- spring mvc MultipartFile 上传文件错误解决
Field error in object 'xxxx' on field 'xxxx': rejected value [20129259128131.jpg]; codes [typeMismat ...
- (Relax 数论1.6)POJ 1061 青蛙的约会(扩展的欧几里得公式)
/* * POJ_1061.cpp * * Created on: 2013年11月19日 * Author: Administrator */ #include <iostream> # ...
- sed正则表达式
sed的正则匹配如何实现非贪婪? sed的正则用的是BREs/EREs,不支持非贪婪模式.当然有一些方法可以实现非贪婪,比如: $ echo abcOabcdOabc | sed 's/.*O//' ...
- CloudStack搭建KVM环境
软件环境:agent:CentOS 6.3,minimal安装,CPU启用VT management server:CentOS 6.3,minimal安装 存储:CentOS 6.3 搭建在mana ...