OC对数组排序有很多种方法

首先声明一个Person类并重写父类的description方法 不会的同学请参照我的博客:

OC的开始(一)之----HelloWord与类的创建及使用

这里说一下重写的父类description方法:当我们不重写这个方法的时候,直接打印出得结果是对象,看代码:

        // 声明多个Person对象Person *p1 = [Person personWithName:@"zhangsan" number:10001 age:26 score:90.5];Person *p2 = [Person personWithName:@"lisi" number:10002 age:22 score:91.5];Person *p3 = [Person personWithName:@"wangwu" number:10004 age:24 score:90.5];Person *p4 = [Person personWithName:@"zhaoliu" number:10003 age:25 score:92.5];Person *p5 = [Person personWithName:@"xiaoqi" number:10008 age:26 score:96.5];Person *p6 = [Person personWithName:@"bazai" number:10006 age:27 score:93.5];Person *p7 = [Person personWithName:@"xiaojiu" number:10005 age:21 score:92.5];Person *p8 = [Person personWithName:@"shidi" number:10007 age:18 score:99.5];// 声明一个不可变数组NSArray *persons = [NSArray arrayWithObjects:p1, p2, p3, p4, p5, p6, p7, p8, nil];NSLog(@"%@", persons);
2015-05-22 15:31:47.320 Test02[1653:116214] ("<Person: 0x100200f80>","<Person: 0x100201270>","<Person: 0x1002012e0>","<Person: 0x100201350>","<Person: 0x1002013c0>","<Person: 0x100201430>","<Person: 0x1002014a0>","<Person: 0x100201510>"
)

这样执行的的显示结果是每一个元素对象在堆内存中站得地址,那么我们看看把description重写后再次打印的结果:

在Person.m文件中重写description方法

- (NSString *)description
{return [NSString stringWithFormat:@"name = %@ number = %ld age = %ld score = %.2f", _name, _number, _age, _score];
}

然后打印结果:

2015-05-22 15:35:00.174 Test02[1669:117516] ("name = zhangsan number = 10001 age = 26 score = 90.50","name = lisi number = 10002 age = 22 score = 91.50","name = wangwu number = 10004 age = 24 score = 90.50","name = zhaoliu number = 10003 age = 25 score = 92.50","name = xiaoqi number = 10008 age = 26 score = 96.50","name = bazai number = 10006 age = 27 score = 93.50","name = xiaojiu number = 10005 age = 21 score = 92.50","name = shidi number = 10007 age = 18 score = 99.50"
)

很明显,当我们直接打印数组的时候,系统调用了父类的description方法。

现在开始我们的排序之旅:

一、使用冒泡排序:

        // 定义一个可变数组,将persons的值赋给可变数组NSMutableArray *muPersons = [NSMutableArray arrayWithArray:persons];// 使用冒泡按照number进行升序排序for (int i = 0; i < muPersons.count - 1; i++) {for (int j = 0; j < muPersons.count - 1 - i; j++) {// 前一个元素的number属性大于后一个元素的number属性时 两个元素交换位置if ([muPersons[j] number] > [muPersons[j + 1] number]) {[muPersons exchangeObjectAtIndex:j withObjectAtIndex:j + 1];}}}NSLog(@"%@", muPersons);

查看结果:

2015-05-22 15:50:26.322 Test02[1719:122150] ("name = zhangsan number = 10001 age = 26 score = 90.50","name = lisi number = 10002 age = 22 score = 91.50","name = zhaoliu number = 10003 age = 25 score = 92.50","name = wangwu number = 10004 age = 24 score = 90.50","name = xiaojiu number = 10005 age = 21 score = 92.50","name = bazai number = 10006 age = 27 score = 93.50","name = shidi number = 10007 age = 18 score = 99.50","name = xiaoqi number = 10008 age = 26 score = 96.50"
)

二、使用sortedArrayUsingSelector排序:

使用sortedArrayUsingSelector之前,需要我们在person中写专门写一个排序的方法供sortedArrayUsingSelector使用。

在person.h文件中自定义排序方法compareSortNumber:

// 自定义排序方法
- (NSComparisonResult)compareSortNumber:(Person *)person;

在person.m文件中实现排序:

// 自定义排序方法
- (NSComparisonResult)compareSortNumber:(Person *)person
{if ([self number] > [person number]) {return NSOrderedDescending;}return NSOrderedSame;
}

在main.m文件中调用sortedArrayUsingSelector对number进行升序排列

        // 使用sortedArrayUsingSelector对number进行升序排列NSArray *selArray = [persons sortedArrayUsingSelector:@selector(compareSortNumber:)];NSLog(@"%@", selArray);

运行结果:

2015-05-22 16:33:49.996 Test02[1927:136447] ("name = zhangsan number = 10001 age = 26 score = 90.50","name = lisi number = 10002 age = 22 score = 91.50","name = zhaoliu number = 10003 age = 25 score = 92.50","name = wangwu number = 10004 age = 24 score = 90.50","name = xiaojiu number = 10005 age = 21 score = 92.50","name = bazai number = 10006 age = 27 score = 93.50","name = shidi number = 10007 age = 18 score = 99.50","name = xiaoqi number = 10008 age = 26 score = 96.50"
)

三、使用sortedArrayUsingComparator对number进行升序排列

        // 使用sortedArrayUsingComparator对number进行升序排列NSArray *comArray = [persons sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {Person *p1 = obj1;Person *p2 = obj2;if ([p1 number] > [p2 number]) {return NSOrderedDescending;}return NSOrderedSame;}];NSLog(@"%@", comArray);

运行结果:

2015-05-22 17:02:44.189 Test02[2039:148253] ("name = zhangsan number = 10001 age = 26 score = 90.50","name = lisi number = 10002 age = 22 score = 91.50","name = zhaoliu number = 10003 age = 25 score = 92.50","name = wangwu number = 10004 age = 24 score = 90.50","name = xiaojiu number = 10005 age = 21 score = 92.50","name = bazai number = 10006 age = 27 score = 93.50","name = shidi number = 10007 age = 18 score = 99.50","name = xiaoqi number = 10008 age = 26 score = 96.50"
)

总结:

使用冒泡排序的时候 我们需要重新定义可变数组对数组中的元素进行排序,sortedArrayUsingSelector排序我们需要写单独写一个方法给sortedArrayUsingSelector调用,太麻烦了,最后一种方法是OC中最常用的排序方法。

OC 数组排序方法论相关推荐

  1. C_教程_MATLAB远程桌面无法使用的问题

    title date tags categories MATLAB远程桌面使用时报错的问题 2019-12-01 07:15:30 -0800 MATLAB 技术 windows自带的远程桌面系统非常 ...

  2. OC中数组排序的3种方法

    总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 大体上 ...

  3. OC:数组排序、时间格式化字符串

    数组排序 //不可变数组的排序 NSArray * arr = [NSArray arrayWithObjects:@"hellow", @"lanou", @ ...

  4. OC第六节 遍历集合、数组排序

    1.遍历的⽅式?for.枚举器.forin. ①.for循环同C语言,循环条件是集合的元素个数或键值对个数,无序的集合要先转换成数组在根据下标遍历 ②.枚举器 NSEnumerator objectE ...

  5. OC --(5)-- 字典、集、数组排序:字典类、集合类、数组数组排序、字典、集合的快速遍历、数组排序...

    字典 1.快速枚举 forin   运行时不能更改内部数据 for (<#type *object#> in <#collection#>) { <#statements ...

  6. OC基础第四讲--字符串、数组、字典、集合的常用方法

    OC基础第四讲--字符串.数组.字典.集合的常用方法 字符串.数组.字典.集合有可变和不可变之分.以字符串为例,不可变字符串本身值不能改变,必须要用相应类型来接收返回值:而可变字符串调用相应地方法后, ...

  7. 【转】 [C/OC的那点事儿]NSMutableArray排序的三种实现(依赖学生成绩管理系统).

    原文网址:http://blog.csdn.net/ministarler/article/details/17018839 c语言实现的学生成绩管理系统是面向过程的,而OC实现的学生成绩管理系统则是 ...

  8. 自己在OC考试中的试题

    Objective-C考试 [关闭] ※ 选择题(共40题,每题2分) 1. 以下说法正确的是________. 答案:(C) A.alloc,retain,release,dealloc都会使对象的 ...

  9. iOS开发基础:OC数组对象NSArray的常用方法

    本文介绍了OC的数组对象的基本方法的使用: 因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作. 其中Person.h中的代码为: [objc] v ...

最新文章

  1. 放心,GPT-3不会“杀死”编程
  2. python+requests实现接口测试 - get与post请求使用
  3. gprof使用介绍 (gcc -pg)
  4. Amazon S3数据存储
  5. Avalonia跨平台入门第二十篇之语音播放问题
  6. 【C语言】找出1000以内可以被3整除的数
  7. windows 安装apex_Nvidia Apex安装
  8. select下拉框怎么去掉空白_行业词库:网站长尾关键词优化怎么做呢?
  9. Java算法之最大子序和
  10. Beetl模板 [记录]
  11. 项目管理工具maven
  12. Linux O(1)调度器
  13. T电脑经典基础知识技术OC
  14. 论文绘图-教你如何绘制响应面
  15. oracle使用with as 提升查询效率
  16. java游戏貂蝉_血战三国之吕布貂蝉
  17. matlab凑数求和,excel自动凑数求和 使用规划求解来解决excel自动凑数求和的方法...
  18. jQuery下载所有版本(实时更新……)
  19. 保护 iOS 用户数据安全: Keychain 和 Touch ID
  20. 【NOIP2015 DAY1 T3 】斗地主(landlords)

热门文章

  1. 偶尔可以停下来休息,但是千万别蹲下来张望
  2. 移动机器人系列5——机器人的闭环控制
  3. 兰州交通大学计算机考试题,兰州交通大学2013级级大学计算机基础试卷(A卷).doc...
  4. 手机游戏降低游戏延迟的软件_如何修复玩手游时候延迟非常高?延迟很高怎么办?...
  5. Java8新特性——Date Time API
  6. C++ 点餐管理系统
  7. uni-app获取当前苹果设备系统版本
  8. “反传销联盟”你的良心何在?
  9. TypeScript如何使用JQuery
  10. 森林怎么训练野人_《森林》全野人/变异人打法技巧图文攻略