iOS数组排序简单介绍

IOS数组按中文关键字以字母序排序 IOS项目中会用到对通讯录的联系人或是会员按姓名为关键字排序,因为NSArray并不直接支持对汉字的排序,这就要通过将汉字转换成拼音完成按A~Z的排序,这看起来是个头疼的问题,因为牵扯到汉字转为拼音,kmyhy给出一个较易实现的方法,获取汉字的首字的首字母,如将“王”变成“W”,完整文章(传送门)。     其中他通过pinyinFirstLetter函数获取中文拼音,函数原理是:“pinyin 阅读详情
摘要: 总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors:

大体上,OC中常用的数组排序有以下几种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors:

1、简单排序(sortedArrayUsingSelector:)

如果只是对字符串的排序,可以利用sortedArrayUsingSelector:方法就可以了,代码如下

//简单排序
void sortArray1(){
    NSArray *array = [NSArray arrayWithObjects:@"abc",@"456",@"123",@"789",@"ef", nil];
    NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"排序后:%@",sortedArray);
}
当然,除了利用字符串自带的compare:方法,也可以自己写compare:方法,进行对象的比较;如下:

首先是新建了Person类,实现方法如下(头文件就省了):

#import "Person.h"
@implementation Person

//直接实现静态方法,获取带有name和age的Person对象
+(Person *)personWithAge:(int) age withName:(NSString *)name{
    Person *person = [[Person alloc] init];
    person.age = age;
    person.name = name;
    return person;
}

//自定义排序方法
-(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;
}

@end
主函数代码如下:
void sortArray2(){
    Person *p1 = [Person personWithAge:23 withName:@"zhangsan"];
    Person *p2 = [Person personWithAge:21 withName:@"lisi"];
    Person *p3 = [Person personWithAge:24 withName:@"wangwu"];
    Person *p4 = [Person personWithAge:24 withName:@"liwu"];
    Person *p5 = [Person personWithAge:20 withName:@"liwu"];
    NSArray *array = [NSArray arrayWithObjects:p1,p2,p3,p4,p5, nil];
    NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(comparePerson:)];
    NSLog(@"排序后:%@",sortedArray);
}
2、利用block语法(sortedArrayUsingComparator:

苹果官方提供了block语法,比较方便。其中数组排序可以用sortedArrayUsingComparator:方法,代码如下:

void sortArray3(){
    NSArray *array = [NSArray arrayWithObjects:@"1bc",@"4b6",@"123",@"789",@"3ef", nil];
    NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

   //这里的代码可以参照上面compare:默认的排序方法,也可以把自定义的方法写在这里,给对象排序
        NSComparisonResult result = [obj1 compare:obj2];
        return result;
    }];
    NSLog(@"排序后:%@",sortedArray);
}

3、高级排序(sortedArrayUsingDescriptors:)

如果是这样一种情况呢?Person类里有另外一个类的变量,比如说Person类除了name,age变量,还有一辆车Car类型,Car类里有个name属性。对Person对象进行排序,有这样的要求:按照Car的name排序,如果是同一辆车,也就是Car的name相同,那么再按照年龄进行排序,如果年龄也相同,最后按照Person的name进行排序。

上面这样就要使用第三种方法,利用排序描述器,不多说,有兴趣可以看看API介绍。代码如下:

首先写个Car类,实现类Car.m代码如下:

#import "Car.h"
@implementation Car

+(Car *)initWithName:(NSString *)name{
    Car *car = [Car alloc] init];
    car.name = name;
    return car;
}

@end

然后改写Person类,实现类Person.m代码如下:

#import "Person.h"
#import "Car.h"
@implementation Person

+(Person *)personWithAge:(int)age withName:(NSString *)name withCar:(Car *)car{
    Person *person = [[Person alloc] init];
    person.age = age;
    person.name = name;
    person.car = car;
    return person;
}

//这里重写description方法,用于最后测试排序结果显示
-(NSString *)description{
    return [NSString stringWithFormat:@"age is %zi , name is %@, car is %@",_age,_name,_car.name];
}

@end
主函数代码如下:
void sortArray4(){
        //首先来3辆车,分别是奥迪、劳斯莱斯、宝马
        Car *car1 = [Car initWithName:@"Audio"];
        Car *car2 = [Car initWithName:@"Rolls-Royce"];
        Car *car3 = [Car initWithName:@"BMW"];
        
        //再来5个Person,每人送辆车,分别为car2、car1、car1、car3、car2
        Person *p1 = [Person personWithAge:23 withName:@"zhangsan" withCar:car2];
        Person *p2 = [Person personWithAge:21 withName:@"zhangsan" withCar:car1];
        Person *p3 = [Person personWithAge:24 withName:@"lisi" withCar:car1];
        Person *p4 = [Person personWithAge:23 withName:@"wangwu" withCar:car3];
        Person *p5 = [Person personWithAge:23 withName:@"wangwu" withCar:car2];

    
        //加入数组
        NSArray *array = [NSArray arrayWithObjects:p1,p2,p3,p4,p5, nil];
        
        //构建排序描述器
        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];
        
        NSArray *sortedArray = [array sortedArrayUsingDescriptors: descriptorArray];
        NSLog(@"%@",sortedArray);
}
结果如下:

从结果看出,先按照age排序,如果age相同,按照car排序,如果car相同,按照name排序。

(注意:上面两种排序方法要想实现字符串显示,请重写description方法)

IOS系统的h5页面排序失效,IOS页面数组按时间排序 IOS系统的h5页面排序失效,IOS页面数组按时间排序 原因自行百度,这里直接给出方法,方法并不是最佳的,凑合着用,有最佳的方法就可以发在评论区。 // 排序方法 //sortby为true时是正序,sortby为 false时是倒序 function sortMethod(arr,sortby) { for (i = 0; i &... 阅读详情

相关推荐

抖音直播小风车跳转企业微信全攻略:企业号申请+落地页配置详解

本文详细解析了抖音直播小风车跳转企业微信的全流程,包括企业号申请、小风车配置和落地页优化。通过实战指南,帮助企业高效实现私域流量沉淀,提升直播转化率,特别适合电商和营销从业者参考。

weixin_29289821的博客 540

iOS 数组排序

1、字母排序 NSArray *arrData = @[@"i",@"b",@"a",@"d",@"e",@"f",@"g",@"h",@"c"]; NSArray *sortArray = [arrData sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%@",sortArray);输出结果:2、数字排序 NSArra

长沙火山 998

Raspberry Pi Pico SDK开发-Timer-定时

RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (PIO)。 本实例将演示如何使用Timer的定时功能。

视觉与物联智能 2005

iOS快速实现数组倒序排列的方法

reverseObjectEnumerator方法是获取一个逆序的NSEnumerator对象,allObjects方法是将逆序的NSEnumerator对象转换成数组。通过这两个系统方法的组合,就可以快速实现数组倒序排列。sortedArrayUsingComparator方法是将数组按指定方式排序,需要传入一个block,用于比较两个元素的大小关系。使用了compare方法进行元素比较,通过返回值来确定元素的排列顺序,从而实现数组倒序排列。

CConch的博客 2183

IOS数组排序整理

IOS数组排序整理demo git地址 说起ios排序,方法有很多种,最近正好有时间,做了一次整理,顺便测试了一下各种排序方法的效率,有不对的地方,望大家指正 测试的排序方法主要有以下几种: 插入排序(自己实现) 快速排序(自己实现) swift array.sorted(by: {(Any, Any) -> Bool}) oc nsarray sortedArray(comparator:

zhoujabcd的博客 1323

iOS 数组排序

一、普通数组排序:  NSArray *array = @[@(3),@(4),@(2),@(1)];    //对数组进行排序    NSArray *result = [array sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {        return [obj1 ...

芷江的博客 826

NSArray 排序汇总

IOS几种简单有效的数组排序方法 //第一种,利用数组的sortedArrayUsingComparator调用 NSComparator ,obj1和obj2指的数组中的对象 [plain] view plaincopy NSComparator cmptr = ^(id obj1, id obj2){    if ([obj1 integ

xiaoxuan415315的专栏 2万+

ios 数组中的字典排序_iOS 中文排序数组、字典排序

数组内中文排序看够了复杂的中文排序封装代码,让我们来点小清新,其实苹果不但为我们提供好了排序方法,并且带有多音字区分,贴心到想哭有木有?845839142L0x6b,0x16,0x0e,0x0f,0xfa,0x5b,0xb3,0xf1,0x59,0x52,0xe1,0x4f,0x43,0x9d,0x9a,0x3e,0x3a,0x99,0x83,0x8a,0x1f,0xf2,0x2b,0x0e,0x...

weixin_35052140的博客 624

ios几种简单有效的数组排序方法

IOS几种简单有效的数组排序方法 //第一种,利用数组的sortedArrayUsingComparator调用 NSComparator ,obj1和obj2指的数组中的对象 NSComparator cmptr = ^(id obj1, id obj2){  if ([obj1 integerValue] > [obj2 integerValue]) {

碧海蓝天的专栏 2214

IOS几种简单有效的数组排序方法

IOS几种简单有效的数组排序方法 //第一种,利用数组的sortedArrayUsingComparator调用 NSComparator ,obj1和obj2指的数组中的对象 NSComparator cmptr = ^(id obj1, id obj2){  if ([obj1 integerValue] > [obj2 integerValue]) {

ch_soft的专栏 3万+

iOS数组排序(倒叙 生序 降序)

1.倒序 在ios开发的过程中,经常需要使数组中的数据倒叙排列!比如在tableView显示数据的时候需要使数据倒序排列!那么如何解决数组的倒序排列问题呢?好多开发的小伙伴可能是便利数组的下标来获取,但是这种方法如果数据很大的情况下程序体验度会降低 , 这里介绍一个方法,一句话便可以搞定数组的倒序排序问题! // NSMutableArray *temp = [NSMutableArray ar...

ZhangJ的博客 2892

数组排序

iphone开发数组排序数组中包括字典) 1。普通数组排序: NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"0",@"8",@"6",@"1",nil]; NSArray *sortedArray = [arr sortedArrayUsingComparator:^NSCom...

weixin_30436891的博客 64

Objective C中数组排序几种情况的总结

原文地址:http://my.oschina.net/pengloo53/blog/173810 1、简单排序(sortedArrayUsingSelector:) 2、利用block语法(sortedArrayUsingComparator:) 3、高级排序(sortedArrayUsingDescriptors:) 大体上,OC中常用的数组排序有以下几种方法

SpringSunLee的专栏 545

排序

1、简单排序(sortedArrayUsingSelector:) 如果只是对字符串的排序,可以利用sortedArrayUsingSelector:方法就可以了,代码如下  ? 1 2 3 4 5 6 //简单排序 void sortArray1(){     NSArray *arr

yizhimuon的博客 427

ios 开发学习日志 自定义alertView 4

一. NSUserDefaults NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存(适合存储轻量级的本地数据),  NSUserDefaults 存储的对象全是不可变的 NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDicti

Yuzhuo1989的博客 340

iOS】对象数组排序简单的方法

一个数组内是对象类型.想根据对象内的属性进行排序. 很多人第一想到的是利用谓词.其实数组自带了一个更简便的方法便于我们进行排序 - (void)sortUsingComparator:(NSComparator NS_NOESCAPE)cmptr NS_AVAILABLE(10_6, 4_0); 举例. 定义一个 Person 对象 @interface Person : NS

雨影的博客 3420

iOS几种简单有效的数组NSArray排序方法

IOS几种简单有效的数组NSArray排序方法 NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil]; // 排序前 NSMutableString *output

番薯大佬的专栏 1305

ios开发数组排序数组中包括字典)

iphone开发数组排序数组中包括字典)   1。普通数组排序:      NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"0",@"8",@"6",@"1",nil];      NSArray *sortedArray = [arr sortedArrayUsingComparator:^NSCompar

碧海蓝天的专栏 1万+

iOS:字典数组排序

iphone开发数组排序数组中包括字典)   1。普通数组排序:      NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"0",@"8",@"6",@"1",nil];      NSArray *sortedArray = [arr sortedArrayUsingComparator:^NSCompar

Sparta-301 860

去水印工具新版.exe

公司内部文件防护水印,文件打开乱码,无法打开等问题,去除文件水印乱码的小工具,使用方便,将文件拖入软件,点击脱除水印

上一篇: navBar设置透明效果
下一篇: xib自动布局介绍
敬业的程序猿
博客等级 码龄11年 51粉丝 77原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值