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