OC 对象数组排序方法分析

常用方法1:

简单排序:sortedArrayUsingSelector:           // 这就是一个方法名,包括冒号,调用这个方法的对象必须是 NSArray 对象。

实际调用代码:

int main() {

    

    NSArray *array = [NSArray arrayWithObjects:@"abc",@"156",@"163",@"789",@"aef", nil];

    NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];// 表示参数是一个 SEL,即一个方法,这个方法的方法名就是 compare:,包括冒号。

    NSLog(@"%@",sortedArray);

    

    

    return 0;

}}


按照规定的方法来排序数组,并且返回一个新的排序好的数组。

可以另写compare:方法来自定义排序的规则,重写格式如下:

//自定义排序方法
-(NSComparisonResult)comparePerson:( Person *)person{
  //默认按年龄排序
    NSComparisonResult result = [[NSNumber numberWithInt:person.age] compare:[NSNumber numberWithInt:self.age]];//注意:基本数据类型要进行数据转换
  //如果年龄一样,就按照名字排序
    if (result == NSOrderedSame) {
        result = [self.name compare:person.name];
    }
    return result;
}
代码如下:

- (NSComparisonResult) compareStu:(Student *) stu            // compare 的参数是一个数组,要排序的数组

{

    NSComparisonResult result = [[NSNumber numberWithDouble:stu.score ] compare:[NSNumbernumberWithDouble:self.score]];

    if(result == NSOrderedSame)

    {

        result = [[NSNumber numberWithDouble:stu.age ] compare:[NSNumber numberWithDouble:self.age]];

        if(result == NSOrderedSame)

        {

            result = [stu.name compare:self.name];

            

        }


        

    }

    return result;

}

调用格式如下:

    // selector 就是 SEL,表示一个方法,一个规则,按照什么规则排序,将自定义的方法作为参数,但是只能排序 NSnumber 类型的数据,

    NSArray *sortedStudents = [students sortedArrayUsingSelector:@selector(compareStu:)];



这个方法是基于系统自带的 compare 方法来编写的,可以参考系统自带的 compare 的文件声明。

 


常用方法2:

使用 block 语法:sortedArrayUsingComparator:

不同方法1的地方在于一个是 selector,一个是 comparator,格式如下:

    NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

   

    }                       ];      //  红色部分是一个 block,使用这个方法是直接在 block 中编写方法即可,也可以先单独写好一个 block,在传入一个 block 作为参数即可
 
 
    NSLog(@"排序后:%@",sortedArray);
}


用法如下:

int main() {

//    NSComparator myComparator = ^(id obj1, id obj2){

//        if ([obj1 integerValue] > [obj2 integerValue]) {

//            return (NSComparisonResult)NSOrderedDescending;

//        }

//        

//        if ([obj1 integerValue] < [obj2 integerValue]) {

//            return (NSComparisonResult)NSOrderedAscending;

//        }

//        return (NSComparisonResult)NSOrderedSame;

//    };

    NSArray *sortArray = @[@"3",@"1",@"4",@"7",@"8",@"2",@"6",@"5"];

  

    NSLog(@"排序前:%@",sortArray);

 

//    NSArray *array = [sortArray sortedArrayUsingComparator:myComparator];      // 也可以使用这样的写法,传入一个block 作为参数。

    NSArray *array = [sortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){

        if ([obj1 integerValue] < [obj2 integerValue]) {                     // 大于小于用于控制返回的数组是升序排序还是降序排列

            return NSOrderedDescending;

        }

        

        if ([obj1 integerValue] > [obj2 integerValue]) {                     // 大于小于用于控制返回的数组是升序排序还是降序排列

            return NSOrderedAscending;

        }

        return NSOrderedSame;

    }];

    

    

    NSLog(@"排序后:%@",array);


    return 0;

}



NSArray *array = @[p1,p2,p3,p4,p5];

    

        //构建排序描述器,每一个要比较的属性对应一个描述器

        NSSortDescriptor *carNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"car.name" ascending:YES];

        NSSortDescriptor *personNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];

        NSSortDescriptor *personAgeDesc = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];

        

        //创建一个描述器数组,放入描述器对象,放入的顺序就是比较时优先比较什么属性的顺序

        //例如:首先按照年龄排序,然后是车的名字,最后是按照人的名字

        NSArray *descriptorArray = [NSArray arrayWithObjects:personAgeDesc,carNameDesc,personNameDesc,nil];

        // 描述器数组中存放的只是描述器对象,并不是要排序的数组内容

NSLog(@"%@",descriptorArray);

     // 将描述器数组作为参数传递给按描述器排序的方法,这个方法由要排序的数组调用,并且返回一个排序好的数组

        NSArray *sortedArray = [array sortedArrayUsingDescriptors: descriptorArray];

        NSLog(@"%@",sortedArray);




同样的,使用 compare 方法也可以实现一样的排序功能。不同的是 compare 的方法是按降序排列的。

- (NSComparisonResult) myCompare:(Person *)person

{

    NSComparisonResult result = [[NSNumber numberWithDouble:person.age] compare:[NSNumber numberWithDouble:self.age]];

    if(result == NSOrderedSame)

    {

        result = [person.car.name compare:self.car.name];

        if(result == NSOrderedSame)

        {

            result = [person.name compare:self.name];

            

        }

        

        

    }

    return result;

}


调用方法:

        NSArray *sortedArray2 = [array sortedArrayUsingSelector:@selector(myCompare:)];

        NSLog(@"%@",sortedArray2);


输出的顺序和 descriptor 的方法刚好相反。


在 OC 中还有非常多的排序方法,以上只是其中较常用的几个,想要学习更多知识可以参考官方的 API。
























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值