OC 数组排序方法论
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 数组排序方法论相关推荐
- C_教程_MATLAB远程桌面无法使用的问题
title date tags categories MATLAB远程桌面使用时报错的问题 2019-12-01 07:15:30 -0800 MATLAB 技术 windows自带的远程桌面系统非常 ...
- OC中数组排序的3种方法
总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 大体上 ...
- OC:数组排序、时间格式化字符串
数组排序 //不可变数组的排序 NSArray * arr = [NSArray arrayWithObjects:@"hellow", @"lanou", @ ...
- OC第六节 遍历集合、数组排序
1.遍历的⽅式?for.枚举器.forin. ①.for循环同C语言,循环条件是集合的元素个数或键值对个数,无序的集合要先转换成数组在根据下标遍历 ②.枚举器 NSEnumerator objectE ...
- OC --(5)-- 字典、集、数组排序:字典类、集合类、数组数组排序、字典、集合的快速遍历、数组排序...
字典 1.快速枚举 forin 运行时不能更改内部数据 for (<#type *object#> in <#collection#>) { <#statements ...
- OC基础第四讲--字符串、数组、字典、集合的常用方法
OC基础第四讲--字符串.数组.字典.集合的常用方法 字符串.数组.字典.集合有可变和不可变之分.以字符串为例,不可变字符串本身值不能改变,必须要用相应类型来接收返回值:而可变字符串调用相应地方法后, ...
- 【转】 [C/OC的那点事儿]NSMutableArray排序的三种实现(依赖学生成绩管理系统).
原文网址:http://blog.csdn.net/ministarler/article/details/17018839 c语言实现的学生成绩管理系统是面向过程的,而OC实现的学生成绩管理系统则是 ...
- 自己在OC考试中的试题
Objective-C考试 [关闭] ※ 选择题(共40题,每题2分) 1. 以下说法正确的是________. 答案:(C) A.alloc,retain,release,dealloc都会使对象的 ...
- iOS开发基础:OC数组对象NSArray的常用方法
本文介绍了OC的数组对象的基本方法的使用: 因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作. 其中Person.h中的代码为: [objc] v ...
最新文章
- 放心,GPT-3不会“杀死”编程
- python+requests实现接口测试 - get与post请求使用
- gprof使用介绍 (gcc -pg)
- Amazon S3数据存储
- Avalonia跨平台入门第二十篇之语音播放问题
- 【C语言】找出1000以内可以被3整除的数
- windows 安装apex_Nvidia Apex安装
- select下拉框怎么去掉空白_行业词库:网站长尾关键词优化怎么做呢?
- Java算法之最大子序和
- Beetl模板 [记录]
- 项目管理工具maven
- Linux O(1)调度器
- T电脑经典基础知识技术OC
- 论文绘图-教你如何绘制响应面
- oracle使用with as 提升查询效率
- java游戏貂蝉_血战三国之吕布貂蝉
- matlab凑数求和,excel自动凑数求和 使用规划求解来解决excel自动凑数求和的方法...
- jQuery下载所有版本(实时更新……)
- 保护 iOS 用户数据安全: Keychain 和 Touch ID
- 【NOIP2015 DAY1 T3 】斗地主(landlords)
热门文章
- 偶尔可以停下来休息,但是千万别蹲下来张望
- 移动机器人系列5——机器人的闭环控制
- 兰州交通大学计算机考试题,兰州交通大学2013级级大学计算机基础试卷(A卷).doc...
- 手机游戏降低游戏延迟的软件_如何修复玩手游时候延迟非常高?延迟很高怎么办?...
- Java8新特性——Date Time API
- C++ 点餐管理系统
- uni-app获取当前苹果设备系统版本
- “反传销联盟”你的良心何在?
- TypeScript如何使用JQuery
- 森林怎么训练野人_《森林》全野人/变异人打法技巧图文攻略