15.Object-C--浅谈Foundation框架OC数组NSArray与NSMutableArray
昨天总结了一下NSString与NSMutableString,今天我在这里总结一下NSArray与NSMutableArray。
NSArray数组是:不可变数组。 nil 是数组元素结束的标记。OC数组中不能存放nil值。
NSMutableArray是可变数组。
同时在OC数组中不能存放非OC对象的数据类型,比如:int 、struct、 enum等类型。
下面开始说一下NSArray数组。
(1).数组的创建 arrayWithObject arrayWithObjects
1 //NSArray 的创建 创建一个元素 arrayWithObject:
2 NSArray * array1 = [NSArray arrayWithObject:@"test"];
3 NSArray *array2 = [NSArray arrayWithObject:@"QYMa"];
4 NSArray *array3 = [NSArray arrayWithObject:@"hahha"];
5 //创建多个元素,要以nil结素
6 NSArray *array4 = [NSArray arrayWithObjects:@"test",@"QYMa",@"hahha", nil];
(2).获取数组某个元素的方法 objectAtIndex 或者直接使用下标 例如:array[i]
1 //获取第2个元素
2 NSString *str = [array4 objectAtIndex:1];
3 NSLog(@"%@",str);
4 //快速获取某个元素 获取第二个
5 NSString *str1 = array4[1];
6 NSLog(@"str1 = %@",str1);
(3).快速创建NSArray数组的方法 @[];由于返回的是NSArray所以这个方法只适用于NSArray,不使用于NSMutableArray
1 //快速创建NSArray 数组
2 NSArray *array5 = @[@"test1",@"test3"];
(4).获取数组元素中的个数 count
1 //获取数组元素的个数
2 NSUInteger num = [array4 count];
3 NSUInteger num1 = array4.count;
下面重点说一下数组遍历的4中方式:
(1).普通for(){}循环遍历,示例代码如下:
1 Person *p = [[Person alloc]init];
2 NSArray *array1 = [NSArray arrayWithObjects:p,@"test",@"QYMa",nil];
3 //1.使用普通for循环
4 NSUInteger cout = array1.count;
5 for(int i = 0; i < cout; i++)
6 {
7 NSLog(@"array1[%d] = %@",i,array1[i]);
8 }
(2).使用增强for循环 for (<#type *object#> in collection);
type 就是元素的数据类型,都是对象类型,所以使用id;
*object 是对应元素的变量名称;
collection 就是你要遍历的集合;
示例代码如下:
1 for (id obj in array1)
2 { //获取obj所在的下标
3 NSLog(@"array1[%ld]= %@",[array1 indexOfObject:obj],obj);
4 }
5 NSLog(@"———————我是逗比的分割线———————");
(3).使用迭代器 NSEnumerator
NSEnumerator用来描述这种集合迭代运算的方式。通过objectEnumerator向数组请求枚举器,如果想从后向前浏览集合,可使用reverseObjectEnumerator方法。在获得枚举器后,可以开始一个while循环,每次循环都向这个枚举器请求它的下一个对象:nextObject。nextObject返回nil值时,循环结束。
示例如下:
1 //3.使用迭代器 遍历数组
2 NSEnumerator *enumerator = [array1 objectEnumerator];
3 id flag;
4 while (flag = [enumerator nextObject])
5 {
6 NSLog(@"array1 = %@",flag);
7 }
8 NSLog(@"———————我是逗比的分割线———————");
(4).使用代码块 遍历数组 enumerateObjectsUsingBlock
id obj 对应的元素;
NSUInteger idx 元素所在下标;
BOOL *stop 跳出循环的条件是 stop为YES;
1 [array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
2
3 {
4
5 NSLog(@"array1[%ld] = %@",idx,obj);
6
7 }];
说完了数组的遍历我们来说说,NSMutableArray可变数组。
看如下代码:
1 NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"test",@"test1",nil];
2 //2.删除元素
3 [mArray addObject:@"test2"];
4 [mArray addObject:@"test3"];
5 //3.获取元素个数
6 NSUInteger counts = mArray.count;
7 NSLog(@"%ld-- %@",counts,mArray);
8 //4.根据下标删除元素
9 [mArray removeObjectAtIndex:1];
10 //5.删除index 位置的所有元素
11 // [mArray removeObjectsAtIndexes:<#(NSIndexSet *)#>];
12 //6.删除最后一个元素
13 [mArray removeLastObject];
14 //7.删除所有元素
15 [mArray removeAllObjects];
16 //8.删除特定元素
17 [mArray removeObject:@"test"];
18 //9.在range 范围内查找特定的元素删除
19 //[mArray removeObject:<#(id)#> inRange:<#(NSRange)#>];
20 //10.删除同时存在于otherArray 和当前集合中的所有元素
21 //[mArray removeObjectsInArray:<#(NSArray *)#>];
22 //11.删除range范围内的所有元素
23 // [mArray removeObjectsInRange:<#(NSRange)#>];
下面通过昨天的字符串和今天数组的总结,做一个小练习,获取文件(夹)中的代码行数。
代码如下:
1 #import <Foundation/Foundation.h>
2 /*
3 计算单个文件的代码行数
4
5 path:文件的全路径
6 返回值 代码行数
7 */
8 int codeLineCounts(NSString *path)
9 {
10 //判断文件的后缀pathExtension 并转化为小写
11 NSString *extension = [[path pathExtension]lowercaseString];
12 //判断文件后缀是否是m
13 if (![extension isEqualTo:@"m"])
14 {
15 return 0;
16 }
17 //1.从文件中读入内容存入到字符串中
18 NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
19 //2.通过字符分割,将分割好的内容存入到数组中
20 NSArray * array = [content componentsSeparatedByString:@"\n"];
21 //3.数组的大小就是 文件的代码行数
22 NSUInteger counts = array.count;
23 //4.将路径/Users/mqy/Desktop/练习代码/ 替换为空
24 NSString *subPath = [path stringByReplacingCharactersInRange:[path rangeOfString:@"/Users/mqy/Desktop/练习代码/"] withString:@""];
25 //输出文件路径和代码行数
26 NSLog(@"%@ --%ld",subPath,counts);
27 return (int)counts;
28 }
29 /*
30 计算文件或者文件夹里面的代码行数
31
32 */
33 NSUInteger codeLineCount(NSString *path)
34 {
35 //1.首先获得文件管理者
36 NSFileManager *mger = [NSFileManager defaultManager];
37 //2.判断路径的有效性,路径是否存在,不存在return
38 BOOL dir = NO;//标记是否为文件夹
39 BOOL exist = [mger fileExistsAtPath:path isDirectory:&dir];
40 //3.如果路径不存在log输出 return
41 if(!exist)
42 {
43 NSLog(@"文件路径不存在,请查看");
44 return 0;
45 }
46 //4.如果路径存在判断是文件夹 还是文件 dir为yes 则为文件夹
47 if (dir)
48 {
49 int count = 0;
50 //5.如果是文件夹,遍历文件夹获取文件夹里面信息
51 NSArray *contentList = [mger contentsOfDirectoryAtPath:path error:nil];
52 //6.遍历数组
53 for (NSString *fileName in contentList)
54 {
55 //7.获取文件的全路径
56 NSString *fullPath = [NSString stringWithFormat:@"%@/%@",path,fileName];
57 //8.获取文件下的代码行数 SUM
58 count += codeLineCount(fullPath);
59
60 }
61 return count;
62
63 }else
64 {
65 return codeLineCounts(path);
66 }
67 return 0;
68 }
69
70 int main(int argc, const char * argv[])
71 {
72 NSString *path = @"/Users/mqy/Desktop/练习代码";
73
74 NSUInteger lineCounts = codeLineCount(path);
75 NSLog(@"代码行数是:%ld",lineCounts);
76
77
78 return 0;
79 }
今天的内容不是特别多,就先总结到这里,后期遇到问题,我再继续总结,如果有什么错误之处,麻烦留言指正!感谢!
浙公网安备 33010602011771号