一、NSArray
1.1 NSArray是OC数组,是不可变数组。OC数组只能存放OC对象,不能存放非OC对象类型,比如int、struct、enum等。
1.2 NSArray不能存放nil值。nil值是数组元素结束的标记。
1.3 NSArray的创建
1> 创建空数组
NSArray *array = [NSArray array]; // 这种方式创建的array永远是空数组
2> 创建单个元素的数组
NSArray *array2 =[NSArray arrayWithObject:@"jack"];
3> 创建多个元素的数组
NSArray *array3 = [NSArray arrayWithObjects:@"jack",@"jim",@"rose", nil]; // nil是数组元素结束的标记
4> 快速创建一个NSArray对象
NSArray *array4 = @[@"jack",@"jim",@"rose"];
1.4 NSArray的元素的个数
NSLog(@"%ld",array4.count);
1.5 NSArray中元素的访问
1> 调用objectAtIndex
NSLog(@"%@",[array3 objectAtIndex:2]);
2> 下标访问:
NSLog(@"%@",array3[2]);
1.6 NSArray元素的遍历
1> 经典for循环遍历
for(int i=0;i<array3.count;i++){
NSLog(@"%@",array3[i]);
}
2> for枚举遍历
for(id obj in array3){
//找出obj元素在数组中的位置
NSUInteger i = [array3 indexOfObject:obj];
NSLog(@"%ld-%@",i,obj);
if(i==1)
{
break;
}
}
3> block遍历
[array3 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%ld-%@",idx,obj);
if(idx==1)
{ //停止遍历
*stop=YES;
}
}];
block遍历的原理:
void ^(myblock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld - %@", idx, obj);
if (idx == 0)
{
// 停止遍历
*stop = YES;
}
};
for (int i = 0; i<array.count; i++)
{
// 用来标记是否需要停止遍历
BOOL isStop = NO;
// 取出元素
id obj = array[i];
myblock(obj, i, &isStop);
if (isStop)
{
break;
}
}
二、NSMutableArray
2.1 NSMutableArray是NSArray的子类,它是可变的OC数组。
2.2 OC数组只能存放OC对象,不能存放nil和非OC对象的数据。
2.3 NSMutableArray对象的创建和初始化
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose",@"jim", nil];
2.4 添加元素
[array addObject:@"jack"];
2.5 删除元素
1> 删除所有元素
[array removeAllObjects];
2> 删除指定元素
[array removeObject:@"jim"];
3> 删除指定下标
[array removeObjectAtIndex:0];
2.6 打印数组
NSLog(@"%@",array);
2.7 注意
@[] 只创建不可变数组NSArray。不能使用如下方法创建可变数组:
NSMutableArray *array = @[@"jim",@"tom"]; // 错误
三、NSSet
3.1 NSSet是无序的集合,在内存中存储方式是不连续的,用于存放多个OC对象。
3.2 NSSet的创建和初始化
NSSet *s = [NSSet setWithObjects:@"jack",@"rose",@"jim",@"lili",nil];
3.3 随机取出一个元素
NSString *str = [s anyObject];
3.4 NSSet和NSArray的对比
1>共同点:
* 都是集合,都能存放多个OC对象
* 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
* 本身都不可变,都有一个可变的子类
2> 不同点:NSArray有顺序,NSSet没有顺序
4、NSMutableSet
4.1 NSMutableSet的初始化
NSMutableSet *s = [NSMutableSet set];
4.2 添加元素
[s addObject:@"jack"];
4.3 删除元素
[s removeObject:@"jack"];
五、NSDictionary
5.1 NSDictionary叫做字典,它里面存储的是一个个键值对。它可以根据key找到相对应的value,即可以通过索引快速找到内容。
5.2 NSDictionary对象的创建
1> 创建单个元素的NSDictionary对象
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
2> 创建多个元素的NSDictionary对象
* NSArray *keys = @[@"name",@"address"];
NSArray *objects = @[@"jack",@"北京"];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
* NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"jack",@"name",
@"北京",@"address",
@"2334343",@"qq",nil];
3> 快速创建多个元素的NSDictionary对象(常用)
NSDictionary *dict = @{@"name":@"jack",@"address":@"北京"};
5.3 获取指定键的值
1> id obj = [dict objectForKey:@"name3"];
2> id obj = dict[@"name"];// 简便方式,常用
5.4 如果获取不到指定键的值,返回null。
5.5 打印键值对的个数
NSLog(@"%ld",dict.count);
六、NSMutableDictionary
6.1 NSMutableDictionary是可变键值对的字典,键值对的存储是没有顺序的。
6.2 NSMutableDictionary对象的创建
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
6.3 NSMutableDictionary元素的添加
[dict setObject:@"jack"forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
6.4 NSMutableDictionary元素的更改:对一个已经存在的键调用setObject可以更改元素内容,覆盖旧值
[dict setObject:@"jack" forKey:@"name"]; //dict[@"name"]的值是jack
[dict setObject:@"rose" forKey:@"name"]; //dict[@"name"]的值是rose
6.5 NSMutableDictionary键值对的移除
[dict removeObjectForKey:@"name"];
6.6 NSMutableDictionary的遍历
1> for循环遍历
// 声明并初始化字典
NSDictionary *dict = @{@"name":@"jack",@"name2":@"rose",@"qq":@"4454546",@"address":@"北京"};
// 获取所有的key值
NSArray *keys = [dict allKeys];
//NSLog(@"%@",keys);
for(int i=0;i<dict.count;i++){
NSString *key=keys[i]; // 获取key值
NSString *object = dict[key]; // 获取key对应的value值
NSLog(@"%@=%@",key,object);
}
// 声明并初始化字典
NSDictionary *dict = @{@"name":@"jack",@"name2":@"rose",@"qq":@"4454546",@"address":@"北京"};
// 调用block遍历字典
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@-%@",key,obj);
//*stop=YES; //停止遍历
}];
6.7 NSDictionary数组
NSArray *persons=@[
@{@"name":@"jack",@"address":@"北京",@"books":@[@"7天突破IOS缟程",@"7天突破android"]},
@{@"name":@"jack2",@"address":@"南京"},
@{@"name":@"jack3",@"address":@"东京"},
@{@"name":@"jack4",@"address":@"上海"},
];
NSDictionary *jack3 = persons[2];
NSLog(@"%@",jack3);
// 先取出下标2位置对应的字典,再取出字典中address这个key对应的数据
NSLog(@"%@",persons[2][@"address"]);
NSString *bookName=persons[0][@"books"][1]; // 取出书名
NSLog(@"%@",bookName);
1> 字典不允许有相同的key,但允许有相同的value(Object)
2> 字典是无序的
7、小结
7.1 NSArray\NSMutableArray
* 有序
* 快速创建(不可变):@[obj1,obj2,obj3]
* 快速访问元素:数组名[i];
7.2 NSSet\NSMutableSet
* 无序
7.3 NSDictionary\NSMutableDictionary
* 无序
* 快速创建:@{key1:value1, key2:value2}
* 快速访问元素:字典名[key]
八、计算代码行数的例子
#import <Foundation/Foundation.h>
//计算单个文件的代码行数
/*
path: 文件的全路径
返回值 int : 代码行数
*/
NSUInteger codeLineCount2(NSString *path)
{
// 1.加载文件内容
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
//NSLog(@"%@",content);
// 2.将文件内容切割成每一行
NSArray *array=[content componentsSeparatedByString:@"\n"];
// int i=0;
// for(NSString *line in array)
// {
// NSLog(@"%d-%@",i,line);
// i++;
// }
return array.count;
}
//计算文件夹的代码行数
/*
path: 文件的全路径(可能是文件夹,也可能是文件)
返回值 int : 代码行数
*/
NSUInteger codeLineCount(NSString *path)
{
// 1.获得文件管理者,它是单例模式,不管调用多少次都只有一个对象
NSFileManager *mgr= [NSFileManager defaultManager];
// 2.判断path是文件夹还是文件路径
BOOL dir = NO; // 标记是否为文件夹
// 3.这个路径是否存在
BOOL exist = [mgr fileExistsAtPath:path isDirectory:&dir];
// 4.如果不存在,直接返回0
if(!exist)
{
NSLog(@"文件路径不存在!");
return 0;
}
// 5.说明路径存在
if(dir){
// NSLog(@"是个文件夹");
// 装着当前文件夹下面的所有内容(文件夹\文件)
NSArray *array=[mgr contentsOfDirectoryAtPath:path error:nil];
int count = 0;
// 遍历数组中的所有文件(夹)名
for(NSString *filename in array)
{
NSString *fullPath = [NSString stringWithFormat:@"%@/%@",path,filename ];
// 累加每个子路径的总行数
count +=codeLineCount(fullPath);
}
return count;
}
else{
//NSLog(@"是个文件");
// 1.判断文件的拓展名
NSString *extension = [[path pathExtension] lowercaseString];
if(![extension isEqualTo:@"h"] && ![extension isEqualTo:@"c"] &&![extension isEqualTo:@"m"])
{
// 文件拓展名不是h,而且也不是m,而且也不是c
return 0;
}
// 2.加载文件内容
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// 3.将文件内容切割成每一行
NSArray *array=[content componentsSeparatedByString:@"\n"];
NSRange range = [path rangeOfString:@"/Users/zhanghong/Desktop/code/oc/"];
NSString *str = [path stringByReplacingCharactersInRange:range withString:@""];
NSLog(@"%@-%ld",str,array.count);
return array.count;
}
}
int main() {
int count =codeLineCount(@"/Users/zhanghong/Desktop/code/oc");
NSLog(@"%d",count);
return 0;
}