博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS笔记之数组排序
阅读量:6265 次
发布时间:2019-06-22

本文共 4294 字,大约阅读时间需要 14 分钟。

简单说明

数组排序比较多,我们讲一种比较常用的,这里涉及到一个知识点: NSComparisonResult:

typedef enum NSComparisonResult : NSInteger {    NSOrderedAscending = -1L,    NSOrderedSame,    NSOrderedDescending} NSComparisonResult;复制代码

NSOrderedAscending: 左边数据比右边小,可理解成增序
NSOrderedSame: 相等
NSOrderedDescending: 左边数据比右边大,可理解成降序


示例:

NSArray *array = @[@"Benz",@"BMW",@"Ferrari",@"Lamborghini"];复制代码

1、普通排序系统自带的升序

NSArray *sortedArray1 = [array sortedArrayUsingSelector:@selector(compare:)];NSLog(@"普通排序:%@",sortedArray1);复制代码

2、逆转数组

NSArray *sortedArray2 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {  //逆转  return NSOrderedDescending;}];NSLog(@"逆转数组:%@",sortedArray2);复制代码

3、不逆转(相当于原数组)

NSArray *sortedArray3 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {  //不逆转  return NSOrderedAscending;}];NSLog(@"不逆转(原数据):%@",sortedArray3);复制代码

4、 升序排列

NSArray *sortedArray4 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {  //升序  NSComparisonResult result = [obj1 compare: obj2];  return result;}];NSLog(@"升序排列:%@",sortedArray4);复制代码

5、降序排列

NSArray *sortedArray5 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {  //降序  NSComparisonResult result = [obj1  compare: obj2];  return -result;}];NSLog(@"降序排列:%@",sortedArray5);复制代码


进阶:

数组里面存放模型,根据模型的某个属性值来对数组进行重新排序

1)、初始化一些车辆和数组:

Car *benz = [Car new];benz.name = @"Benz";benz.price = 2000.0;    Car *bmw = [Car new];bmw.name = @"BMW";bmw.price = 800;    Car *ferrari = [Car new];ferrari.name = @"Ferrari";ferrari.price = 1200;    Car *lamborghini = [Car new];lamborghini.name = @"Lamborghini";lamborghini.price = 12000;    NSMutableArray *array = @[benz,bmw,ferrari,lamborghini].mutableCopy;复制代码

2)、排序方法

/** 对数组里存放model的某个属性对数组进行重新排序 @param array 待排序数组 @param increase 是否增序排列 @param key 属性 @return <#return value description#> */-(NSArray *)sortArray:(NSArray *)array increase:(BOOL)increase byKey:(NSString *)key{        array = [array sortedArrayUsingComparator:             ^NSComparisonResult(Car *obj1, Car *obj2) {                 NSComparisonResult result;                 if ([key isEqualToString:@"price"]) {                     CGFloat res1 = [[obj1 valueForKey:key] floatValue];                     CGFloat res2 = [[obj2 valueForKey:key] floatValue];                     if (increase) {                         if (res1 < res2){                             result = NSOrderedAscending;                         }else {                             result = NSOrderedDescending;                         }                     } else {                         if (res1 < res2){                             result = NSOrderedDescending;                         }else {                             result = NSOrderedAscending;                         }                     }                 } else {                     result = [[obj1 valueForKey:key] compare:[obj2 valueForKey:key]];                     if (!increase) {                         if (result == NSOrderedDescending) {                             result = NSOrderedAscending;                         } else if (result == NSOrderedAscending) {                             result = NSOrderedDescending;                         }                     }                 }                                  return result;             }].mutableCopy;    return array;}复制代码

3)、打印结果

NSArray *sortArray;sortArray = [self sortArray:array increase:YES byKey:@"price"];NSLog(@"increase by price:");for (Car *c in sortArray) {  NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);}NSLog(@"------分割线------");sortArray = [self sortArray:array increase:NO byKey:@"price"];NSLog(@"descend by price:");for (Car *c in sortArray) {  NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);}NSLog(@"------分割线------");    sortArray = [self sortArray:array increase:YES byKey:@"name"];NSLog(@"increase by name:");for (Car *c in sortArray) {  NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);}NSLog(@"------分割线------");    sortArray = [self sortArray:array increase:NO byKey:@"name"];NSLog(@"descend by name:");for (Car *c in sortArray) {  NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);}复制代码

Warnning: 可能有眼尖的看客发现了,increase by namedescend by name顺序不对,升序的时候Benz不应该在BMW前面吗?降序Benz在BMW后面吗?注意,这里M是大写,而e是小写,大写的ASCII码在小写前面,所以M比e前。

联系方式

邮箱: xiebangyao_1994@163.com

相关账号:

转载地址:http://mrdpa.baihongyu.com/

你可能感兴趣的文章
CSS选择器
查看>>
excel
查看>>
echarts 通过ajax实现动态数据加载
查看>>
python-web-server-tcp1
查看>>
shell脚本入门
查看>>
Management
查看>>
URAL 2048 Histroy(打表+模拟)
查看>>
深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)
查看>>
【转】oracle in与exists语句的区别
查看>>
RPC 使用中的一些注意点
查看>>
Django_rest framework 框架介绍
查看>>
Hello world,Hello 2014,Bye 2013
查看>>
python之正则表达式模块
查看>>
BFC和清除浮动
查看>>
笔记:2016-06-04
查看>>
ECSHOP 布局参考图
查看>>
Entity Framework 延伸系列目录
查看>>
Java 代码安全(一) —— 避免用String储存敏感数据
查看>>
制作一个最小Linux系统
查看>>
3个著名加密算法(MD5、RSA、DES)的解析
查看>>