iOS笔记之数组排序

简单说明

数组排序比较多,我们讲一种比较常用的,这里涉及到一个知识点:
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前。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数组可对其中包含的元素进行排序。 在排序前,我们需要定义一个Model类,将Model类对象添加至数组中。 定义一...
    SkyMing一C阅读 13,733评论 0 15
  • 排序规则描述类: NSSortDescriptor NSSortDescriptor来指定排序规则, 对集合等进行...
    SkyMing一C阅读 11,634评论 3 12
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,536评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,133评论 18 399
  • 曾经有个人,但偏偏风雨渐大,大到我看不到他。 ——题记 记得早...
    muamon阅读 1,514评论 0 0