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 }

  今天的内容不是特别多,就先总结到这里,后期遇到问题,我再继续总结,如果有什么错误之处,麻烦留言指正!感谢!

  

posted @ 2015-04-10 18:35  Qingyun_Qearl  阅读(332)  评论(0)    收藏  举报