NSArray与NSMutableArray
1.NSArray基本概念
什么是NSArray
NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组
NSArray有哪些使用注意
- 只能存放任意OC对象, 并且是有顺序的
- 不能存储非OC对象, 比如int\float\double\char\enum\struct等
- 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
- NSArray使用NSLog()打印,输出的是小括号的格式。
- NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。nil就是0。0也是基本数据类型,不能存放到NSArray中。
NSArray的常用方法
- (NSUInteger)count;
获取集合元素个数
-
(id)objectAtIndex:(NSUInteger)index;
获得index位置的元素
-
(BOOL)containsObject:(id)anObject;
是否包含某一个元素
-
(id)lastObject;
返回最后一个元素
-
(id)firstObject;
返回最后一个元素
-
(NSUInteger)indexOfObject:(id)anObject;
查找anObject元素在数组中的位置(如果找不到,返回-1)
-
(NSUInteger)indexOfObject:(id)anObject
inRange:(NSRange)range;
在range范围内查找anObject元素在数组中的位置
书写NSArray简写形式
NSArray *arr = [NSArray arrayWithObjects:@"lnj", @"lmj", @"jjj", nil]; NSArray *arr = @[@"lnj", @"lmj", @"jjj"]; // 获取数组元素的简写 NSLog(@"%@", [arr objectAtIndex:0]); NSLog(@"%@", arr[0]);
2.NSArray遍历
增强for 循环的使用
如何使用增强for循环,遍历NSArray数组
//逐个取出arr中的元素, 将取出的元素赋值给obj // 注意: obj的类型可以根据数组中元素的类型来写, 不一定要写NSObject for (NSString *obj in arr) { NSLog(@"obj = %@", obj); }
如何使用OC数组的迭代器来遍历数组
// 每取出一个元素就会调用一次block // 每次调用block都会将当前取出的元素和元素对应的索引传递给我们 // obj就是当前取出的元素, idx就是当前元素对应的索引 // stop用于控制什么时候停止遍历 [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if (idx == 1) { *stop = YES; } NSLog(@"obj = %@, idx = %lu", obj, idx); }];
3.数组排序
如何对数据进行排序
NSArray *arr = @[@10, @20, @5, @7, @15]; NSLog(@"排序前: %@", arr); // 注意: 想使用compare方法对数组中的元素进行排序, 那么数组中的元素必须是Foundation框架中的对象, 也就是说不能是自定义对象 elector:@selectoNSArray *newArr = [arr sortedArrayUsingSr(compare:)]; NSLog(@"排序后: %@", newArr);
如何对对象进行排序
Person *p1 = [Person new]; p1.age = 10; Person *p2 = [Person new]; p2.age = 20; Person *p3 = [Person new]; p3.age = 5; Person *p4 = [Person new]; p4.age = 7; NSArray *arr = @[p1, p2, p3, p4]; NSLog(@"排序前: %@", arr); // 按照人的年龄进行排序 // 该方法默认会按照升序排序 NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) { // 每次调用该block都会取出数组中的两个元素给我们 // 二分 // NSLog(@"obj1 = %@, obj2 = %@", obj1, obj2); return obj1.age > obj2.age; //降序 // return obj1.age < obj2.age; //升序 /* 改方法,产生随机数用 if (obj1.age > obj2.age) { // 5 4 return NSOrderedDescending; }else if(obj1.age < obj2.age) { // 4 5 return NSOrderedAscending; }else { return NSOrderedSame; } */ }]; NSLog(@"排序后: %@", newArr);
4.NSArray和NSString转换
NSArray *arr = @[@"lnj", @"lmj", @"jjj"];
如何将数组中每个元素拼接成字符串
方法一:
// 1.定义一个可变字符串保存拼接之后的结果 NSMutableString *strM = [NSMutableString string]; // 2.遍历数组, 取出数组中的每一个元素, 将元素添加到可变字符串中 for (NSString *str in arr) { [strM appendString:str]; // 3.每次添加完毕之后再添加一个- [strM appendString:@"-"]; } [strM deleteCharactersInRange:NSMakeRange(strM.length - 1, 1)]; NSLog(@"strM = %@", strM);
方法二:
//把数组元素链接成字符串,用**作拼接符将数组元素拼接成一个字符串 NSString *str = [arr componentsJoinedByString:@"**"]; NSLog(@"str = %@", str);
如何通过一个字符串生成一个数组
字符串分割方法
NSString *str = @"lnj**lmj**jjj"; NSArray *arr = [str componentsSeparatedByString:@"**"]; NSLog(@"arr = %@", arr);
5.NSArray文件读写
如何将数组写入文件中
NSArray *arr = @[@"lnj", @"lmj", @"jjj"]; BOOL flag = [arr writeToFile:@"/Users/xiaomage/Desktop/abc.plist" atomically:YES]; NSLog(@"flag = %i", flag);
将数组写入文件中,有什么注意点
- 注意1:如果将一个数组写入到文件中之后, 本质是写入了一个XML文件 在iOS开发中一般情况下我们会将XML文件的扩展名保存为plist
- 注意2:writeToFile只能写入数组中保存的元素都是Foundation框架中的类创建的对象, 如果保存的是自定义对象那么不能写入
如何从文件中读取数据到NSArray中
- 从文件中读取一个数组,此方法在字典转模型中,经常用到
NSArray *newArray = [NSArray arrayWithContentsOfFile:@"/Users/xiaomage/Desktop/abc.plist"]; NSLog(@"%@", newArray);
6.NSMutableArray
可变数组 增删改查
什么是可变数组?和NSArray有什么区别
- NSMutableArray是NSArray的子类
- NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素
- NSMutableArray是可变的,随时可以往里面添加\更改\删除元素
如何创建一个空的数组?创建可变数组有什么注意点?
1.创建空数组
NSMutableArray *arrM
= [NSMutableArray array];
NSMutableArray *arrM = [[NSMutableArray alloc] init];
2.注意点:
- 不能通过@[]来创建一个可变数组, 因为@[]创建出来的是一个不可变的数组
- 如果把一个不可变数组当做一个可变数组来使用, 会引发一个运行时的错误
例如:
NSMutableArray *arrM = @[@"lnj", @"lmj"]; [arrM addObject:@"JJJ"];
如何给可变数组增加内容 方法一:
[arrM addObject:@"lnj"];
方法二:
// 将指定数组中的元素都取出来, 放到arrM中 \ 并不是将整个数组作为一个元素添加到arrM中 [arrM addObjectsFromArray:@[@"lmj", @"jjj"]]; // 注意: 以下是将整个数组作为一个元素添加 // [arrM addObject:@[@"lmj", @"jjj"]]; NSLog(@"%@", arrM);
如何给可变数组插入内容
[arrM insertObject:@"xcq" atIndex:1]; NSRange range = NSMakeRange(2, 2); NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range]; // 插入一组数据, 指定数组需要插入的位置, 和插入多少个 [arrM insertObjects:@[@"A", @"B"] atIndexes:set];
如何删除可变数组中的内容
删除指定元素:
[arrM removeObjectAtIndex:0];
删除数组中最后一个元素
[arrM removeLastObject];
删除index位置的元素
[arrM removeObject:@"A"];
如何替换可变数组中的内容
[arrM replaceObjectAtIndex:1 withObject:@"M"]; //简写: arrM[0] = @"ZS"; NSLog(@"%@", arrM);
如何获取可变数组中的内容
NSLog(@"%@", [arrM objectAtIndex:0]);