第一讲 NSArray、NSMutableArray
一、NSArray
概述:NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组,C语言中数组的弊端,int array[4] = {10, 89, 27, 76};只能存放一种类型的数据.(类型必须一致),不能很方便地动态添加数组元素、不能很方便地动态删除数组元素(长度固定)。
使用注意:只能存放任意OC对象, 并且是有顺序的,不能存储非OC对象, 比如intfloatdoublecharenumstruct等它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
1、数组的创建
1 NSArray *array = [NSArray array]; //类方法创一个数组,这个数组永远为空 2 NSArray *arr = [[NSArray alloc]init]; //对象方法创建一个数组,这个数组永远为空 3 NSArray *array2 = [NSArray arrayWithObject:@“jack”]; //类方法创建含有一个元素的数组 4 NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil]; //创建含有多个元素的NSArray数组 5 NSArray *array4 = @[@"jack", @"rose", @“4324324"]; // 快速创建一个NSArray数组
2、数组的访问
1 NSArray *array4 = @[@"jack", @"rose", @"4324324"]; 2 NSLog(@"%ld", array4.count);//输出数组元素个数 3 NSLog(@"%@", [array4 objectAtIndex:1]); //访问数组中索引为1的元素 4 NSLog(@"%@", array4[0]);//访问数组中索引为0的元素 5 NSLog(@"last =%@",[array4 lastObject]); //访问数组中的最后一个元素 6 NSLog(@"first = %@",[array4 firstObject]); //访问数组的的第一个元素
3、数组的遍历
1 //1.常规遍历 2 NSArray *arr = [NSArray arrayWithObjects:@"jjj",@"ddd",@"yyy",@"vvv", nil]; 3 for (int i = 0; i < arr.count; i++) { 4 NSLog(@“%@",arr[i]); 5 } 6 //2.增强for循环 7 for (NSObject *obj in arr ) { 8 NSLog(@"obj = %@",obj); 9 } 10 //3.OC迭代器 11 [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 12 if (idx == 2) { 13 *stop = YES; 14 } 15 NSLog(@"obj =%@,idx = %lu",obj,idx); 16 }];
4、自定对象数组方法调用
1 //假设person类中有say 和 sayWithName:withObject方法 2 - (void)say 3 { 4 NSLog(@"加油"); 5 } 6 - (void)sayWithName:(NSString *)name 7 { 8 NSLog(@"%@ 加油", name); 9 } 10 NSArray *arr1 = @[p,p1,p2,p3,p4]; 11 //第一种方式 调用无参的 12 [arr1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 13 [obj say]; 14 }] 15 //第二种方式 调用无参的 16 [arr1 makeObjectsPerformSelector:@selector(say)]; 17 //调用有参的 18 [arr1 makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"tg" ];
5、数组的排序
1 //1.OC对象数组的排序 2 NSArray *arr = [NSArray arrayWithObjects:@81,@22,@53,@34,@8, nil]; 3 //数组的排序方法 sortedArrayUsingSelector 4 NSArray *newStr = [arr sortedArrayUsingSelector:@selector(compare:)]; 5 NSLog(@"%@",newStr); //输出结果:8,22,34,53,81 6 //2.自定义对象数组的排序 7 Person *p = [[Person alloc]init]; 8 p.age = 14 ; 9 Person *p1 = [[Person alloc]init]; 10 p1.age = 210 ; 11 Person *p2 = [[Person alloc]init]; 12 p2.age = 50 ; 13 Person *p4 = [[Person alloc]init]; 14 p4.age = 20 ; 15 Person *p3 = [[Person alloc]init]; 16 p3.age = 54 ; 17 NSArray *arr =@[p,p1,p2,p3,p4]; 18 NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) { 19 return obj1.age > obj2.age; // 二分法 20 }]; 21 NSLog(@“输出排序后的数组%@",newArr);
6、NSArray和NSString之间的转换
1)数组之间的元素用"-"连接
1 //数组元素之间用-相连 2 NSArray *arr = @[@"lnj",@"lmj",@"jjj"]; 3 NSMutableString *strM = [NSMutableString string]; 4 for(NSString *str in arr ) { 5 [strM appendString:str]; 6 [strM appendString:@"-"]; 7 } 8 [strM deleteCharactersInRange:NSMakeRange(strM.length-1, 1)]; 9 NSLog(@"%@",strM); //输出结果:lnj-lmj-jjj
2)数组之间的元素用"**"连接
1 NSArray *arr = @[@"lnj",@"lmj",@"jjj"]; 2 NSString *str = [arr componentsJoinedByString:@"**"]; 3 NSLog(@"str = %@",str); //输出结果:str = lnj**lmj**jjj
3)将一个字符串切割成数组
1 //将一个字符串切割成数组 2 NSString *str = @"lnj*lmj*zyt"; 3 NSArray *arr = [str componentsSeparatedByString:@"*"]; 4 NSLog(@"arr = %@",arr);
7、数组的读写
1)将数组写入到文件中
1 //数组中的元素须是Foundation框架中得OC对象 2 NSArray *arr = @[@"rty",@"xds",@"yer"]; 3 BOOL flag =[arr writeToFile:@"/Users/tangge/Desktop/赵玉堂.plist" atomically:YES]; 4 NSLog(@"flag = %d",flag); 5 6 //数组元素是自定义对象不能写入到文件中 7 Person *p = [[Person alloc] init]; 8 p.age = 13; 9 Person *p1 = [[Person alloc] init]; 10 p.age = 25; 11 Person *p2 = [[Person alloc] init]; 12 p.age = 34; 13 Person *p3 = [[Person alloc] init]; 14 NSArray *arr = @[p,p1,p2,p3,p4,p5]; 15 bool flag = [arr writeToFile:@"/Users/tangge/DeskTop/堂哥.plist" atomically:YES ]; //报错 16 NSLog(@"%d",flag);
2)从文件中读取数组
1 NSString *path = @"/Users/tangge/DeskTop/赵玉堂.plist"; 2 NSArray *arr = [NSArray arrayWithContentsOfFile:path]; 3 NSLog(@"%@",arr);
8、判断一个数组是否包含某一元素
1 NSArray *arr = [NSArray arrayWithObjects:@"zyt",@"yyu",@"zjj", nil]; 2 if ([arr containsObject:@"yt"]) { 3 //包含返回YES,否则包含NO 4 NSLog(@"arr中包含zyt"); 5 } 6 else 7 { 8 NSLog(@"arr中不包含zs"); 9 }
二、NSMutableArray
概述:NSMutableArray是NSArray的子类,NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素,NSMutableArray是可变的,随时可以往里面添加更改删除元素。
1、NSMutableArray的创建
1 NSMutableArray *array = [NSMutableArray array]; //创建一个空的可变数组 2 NSMutableArray *array = [NSMutableArray arrayWithObject:@"zyt"];//创建含一个元素的可变数组 3 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil]; //创建含有多个元素可变数组
2.NSMutableArray基本使用
1 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil]; //创建一个可变数组 2 [array addObjectsFromArray:@[@"zyt",@"ttt",@"ggg"]];//将指定数组中得元素都取出来,放到array中,并不是将整个数组作为一个元素添加arrM数组中 3 [array addObject:@“jack"]; //向数组添加一个元素,不能向数组中添加空元素 [array addObject:nil] 4 [array addObject:@[@“lmj",@"lng"]]; //以下是将整个数组作为一个元素推添加 5 [array insertObject:@"XCQ" atIndex:0]; //通过指定索引向array中插入一个元素 6 [array removeAllObjects]; // 删除数组所有元素 7 [array removeObject:@"jack"];// 删除指定的对象 8 [array removeObjectAtIndex:0];//删除索引对应位置的元素 9 [array removeLastObject]; // 删除最后一个元素 10 [array replaceObjectAtIndex:0 withObject:@“C"]; //替换指定索引位置的元素 11 array[0] = @"wwwww";//替换指定位置的元素 12 //插入一组数数据,指定数组需要插入的位置 和 需要插入的个数 13 NSRange range = NSMakeRange(0, 2); 14 NSIndexSet *set =[NSIndexSet indexSetWithIndexesInRange:range]; 15 [array insertObjects:@[@"A",@"B"] atIndexes:set];
3、NSArray和NSMutableArray比较
NSArray是可变的,NSMutableArray是不可变的。NSMutableArray不能通过@[]来创建一个不可变数组,因为@[]创建出来的是一个不可变数组,如果把一个不可变数组当做一个可变数组会引发一个运行时错误。