OC语言基础八:OC数组


OC数组是oc集合数据类型中的一种,是有序集合,其他的两个是oc字典和set,是无序集合。

不可变数组

创建

1.initWithObjects方法结尾有个nil,是添加元素结束的标志,不作为真实的元素出现,也不会影响数组中元素的个数。
注意:基本数据类型不可以直接放入到OC数组,这是OC数组和C语言数组的一个区别。
但是可以通过NSNumbe把基本数据类型转转换成OC对象。
NSNumber *number=@1.1;
OC数组可以嵌套使用,即数组元素也可以是数组。

NSArray *array=[[NSArray alloc] initWithObjects:@"one",@"two",@"three",nil];
NSLog(@"%@",array);

2.元素个数:array.count
简化方式创建数组:就不能写nil,因为程序会自动在转换成第一种方式,会自动在末尾添加nil。

array=@[@"1",@"2",@"3",@"4"];

3.arrayWithObjects类方法创建
NSNumber *number=@1.1;
//如果NSNumber *number=nil;那么下面的代码就不会添加number以后的元素。

array=[NSArray arrayWithObjects:@"one",number,array,nil];

建议同一个数组中,元素类型是一样的。

取出数组中元素

NSArray *subarray =[array objectAtIndex:2];
或NSArray *subarray =array[2];
//如果不知道元素具体类型可以用id 范型指针,可以指代任意类型的对象,代替,注意id 后没*号。
id  object =[array objectAtIndex:2];

遍历数组

1.for循环,如果关注索引值i,要使用它,就需要用此方法。

NSArray *array=@[@"1",@"2",@"3",@"4"];
for(NSInteger i=0;i<array.count;i++){
NSLog(@"object:%@",array[i]);
}

2.for in循环又叫快速枚举,循环中的每个元素会赋给object,如果不清楚具体类型,比如就把NSString 用id代替。如果不关注索引值,而只关注元素值,就可用此方法。

for(NSString *object in array){
NSLog(@"%@",object);
}

3.枚举器

NSEnumerator *enumerator=[array objectEnumerator];
id object=[enumerator nextObject];
while(object){
  NSLog(@"object:%@",object);
  object=[enumerator nextObject]; 
}

排序

sortedArrayUsingSelector是方法选择器,我们可以选择方法使用。

NSArray *array=@[@"5",@"3",@"4",@"1",@"2"];
NSArray *resultArray=[array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",resultArray); 

结果是按升序排序的。1,2,3,4,5

字符串是提供了compare方法的,如果元素的类没有提供compare方法,程序就会崩溃。

对自定义的类进行排序

方法选择器

结果只能是升序

//Person.h
#import <Foundation/Foundation.h>
@interface Person:NSObject
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign) NSUInteger age;
+(instancetype)personWithName:(NSString *)name age:(NSUInteger)age;
-(NSComparisonResult)comparePerson:(Person*)person;

//Person.m
+(instancetype)personWithName:(NSString *)name age:(NSUInteger)age{
 Person *person=[[self alloc]init];
 person.name=name;//注意不可以使用_name因为是在类方法中,类方法是能直接操作成员变量的。
 perosn.age=age
 return person;
}
-(NSComparisonResult)comparePerson:(Person*)person{
return [self.name compare:person.name];//因为字符串有compare方法,所以如果以name比较的话可以直接返回。
}
-(NSString *)description{
  return [NSString stringWithFormat:@"name=%@,age=%zd",_name,age];
}//想要再打印类的时候结果理想,必须重写description方法


//main.m
Person *person1=[Person personWithName:@"xiaohong" age:2];
Person *person2=[Person personWithName:@"tom" age:14];
Person *person3=[Person personWithName:@"xiaohong" age:20];
Person *person4=[Person personWithName:@"chenglong" age:30];
Person *person5=[Person personWithName:@"tim" age:5];
NSArray *array=@[person1,person2,person3,person4,person5];
NSArray *resultArray=[array sortedArrayUsingSelector:@selector(comparePerson:)]; 
//选择器不能用compare方法,因为Person类没有compare方法,选择器找不到方法就会蹦
NSLog(@"%@",resultArray); 

自定义对象指定规则来排序,通过重写,排序方法的返回值一定要是NSComparisonResult类型,是一种枚举类型,升序,降序,相同,方法名称可以顺便取,但是后面必须有一个参数,因为比较肯定是两两进行比较的。

排序描述器

给数组提供排序的规则,key一定要是类存在的属性,ascending :YES升序,NO降序。非常灵活。

NSSortDescription *desc1=[NSSortDescriptor sortDescriptorWithKey:@“name” ascending:NO];
NSSortDescription *desc2=[NSSortDescriptor sortDescriptorWithKey:@“age” ascending:NO];
NSArray *resultArray=[array sortedArrayUsingDescriptors:@[desc1]];
//NSArray *resultArray=[array sortedArrayUsingDescriptors:@[desc1,desc2]];先按第一个条件名字排序,如果name相同,就按第二个条件age排
NSLog(@"%@",resultArray); 

其他方法

数组第一个元素和最后一个元素

NSArray *array=@[@"1",@"2",@"3",@"4"];
NSLog(@"first object:%@",array.firstObject);
NSLog(@"last object:%@",array.lastObject);

数组元素拼接成字符串

NSString *string=@"I love you";
NSArray *array1=[string componentsSeparatedByString:@" "];//字符串分割成数组
NSLog(@"%@",array1);
NSString *string1=[array1 componentsJoinedByString:@"-"];//数组拼接
NSLog(@"%@",array1);

可变数组

内存空间可数据是可以修改的。

NSMutableArray *array=[NSMutableArray array];
添加元素
[array addObject:@1];
[array addObject@"one"];
插入元素
[array insertObject:@2 atIndex:1];//插入到2的位置,结果是对象2,在下标2的位置。
删除元素
[array removeObject:@2];//将数组中是2的元素,全部删掉
[array removeAllObjects];//删除所有元素,得到的结果是个空数组
替换元素
[array replaceObjectAtIndex:1 withObject:@22];//将下标1的元素替换成22
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值