&&回顾C语言中的数组使用方法
int a[5] = {1,2};
int *pa[3]; //数组长度为3
特点: 1.集合 2.类型相同 3.有序(下标/内存连续)
弊端:1.只能存放一种类型的数据(类型必须一致)
2.不能方便地动态地添加、删除数组元素(长度固定)
&&NSArray数组
NSArray是OC中数组类
特点:1只能存放任意OC对象,并且是有序的
2不能存储非OC对象,比如int\float\double\char\enum\struct等
3它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素,也不能再往里面添加元素
1.NSArray 的创建方式
NSArray的类方法创建
+ (instancetype)array; //空数组
+ (instancetype)arrayWithObject:(id)anObject;
+ (instancetype)arrayWithObjects:(id)firstObj,...;
+ (instancetype)arrayWithArray:(NSArray *)array;
+ (id)arrayWithContentsOfFile:(NSString *)path; //读取一个xml文件
+ (id)arrayWithContentsOfURL:(NSURL *)url; //读取一个xml文件
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// NSArray特点:
// 一旦创建成功,内容不可改变
// 只能存放OC对象
//1.创建一个空数组
// 这样的数组永远是空的,不可能向其中增加值(不可变性)
NSArray *arr1 = [NSArray array];
NSLog(@"arr1 = %@",arr1);
//2.创建数组,只有一个元素 (id 对象类型)
NSArray *arr2 = [NSArray arrayWithObject:@"1"];
NSLog(@"arr2 = %@",arr2);
//3.创建数组,有多个元素
// nil 表示数组赋值结束,最后一个元素
// nil不可以包含在数组中
// 常见写法
NSArray *arr3 = [NSArray arrayWithObjects:@"one",@"two",@1, nil];
NSLog(@"arr3 = %@",arr3);
//4.调用对象方法,创建数组
NSArray *arr4 = [[NSArray alloc] initWithObjects:@"three",@"four", nil];
NSLog(@"arr4 = %@",arr4);
//5.用一个数组可以创建另外一个数组
NSArray *arr5 = [NSArray arrayWithArray:arr3];
NSLog(@"arr5 = %@",arr5);
NSLog(@"Hello, World!");
}
return 0;
}
打印结果
arr1 = (
)
arr2 = (
1
)
arr3 = (
one,
two,
1
)
arr4 = (
three,
four
)
arr5 = (
one,
two,
1
)
nil用法
NSArray *arr3 = [NSArray arrayWithObjects:@"one",@"two",@1, nil];
NSLog(@"arr3 = %@",arr3);
打印结果
rr3 = (
one
)
NSNull用法
NSArray *arr3 = [NSArray arrayWithObjects:@"one",[NSNull null],@"two",@1, nil];
打印结果
arr3 = (
one,
"<null>",
two,
1
)
2.NSArray的常见用法
// 获取集合元素个数
- (NSUInteger)count;
// 获得index位置的元素 (下标)
- (id)objectAtIndex:(NSUInteger)index;
// 判断是否包含某一个元素
- (BOOL)containsObject:(id)anObject;
// 返回第一个元素
- (id)firstObject;
// 返回最后一个元素
- (id)lastObject;
// 查找anObject元素在数组中的位置(如果找不到,返回-1)NSNotFound
- (NSInteger)indexOfObject:(id)anObject;
// 在range范围内查找anObject元素在数组中的位置
- (NSInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
#import <Foundation/Foundation.h>
void test() {
// 数组常见方法
NSArray *arr3 = [NSArray arrayWithObjects:@"one",@"two",@1,@"three", nil];
NSLog(@"arr3 = %@",arr3);
// 1.获得数组的长度 count获取数组元素个数
NSLog(@"%ld",arr3.count);
// 2.根据下标,获取下标2对应的对象,即第三个元素“1”
NSLog(@"%@",[arr3 objectAtIndex:2]);
// 3.返回元素的下标 用无符号整形数接收下标
NSUInteger loc = [arr3 indexOfObject:@"three"];
NSLog(@"%ld",loc);
// 4.数组中是否包含了某个元素
// [arr3 containsObject:@"one"];
if ([arr3 containsObject:@"one"]) {
NSLog(@"包含此元素");
} else {
NSLog(@"不包含");
} //打印结果:包含此元素
}
简化的方式来定义、访问数组
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 用简化的方式来定义和访问数组元素
// 1)用简化的方式,定义数组
// 格式:@[ 数组元素 ]
NSArray *arr = @[@"1",@"2",@"3",@4,@"ONE"];
NSLog(@"arr = %@",arr);
NSString *str = [arr objectAtIndex:2];
NSLog(@"%@",str);
// 2)用简化的方式访问数组元素
str = arr[1]; //C语言形式的数组访问元素
NSLog(@"%@",str);
}
return 0;
}
打印结果
arr = (
1,
2,
3,
4,
ONE
)
3
2
3.NSArray的遍历方法
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 定义一个数组
NSArray *arr = @[@"one",@"two",@"three",@"four"];
// 对数组进行遍历
//1) 普通的方式,通过下标访问
for (int i = 0; i<arr.count; i++) {
NSLog(@"-> %@",arr[i]);
}
//2) 快速枚举法 for循环的增强形式
for (NSString *str in arr) {
NSLog(@"---> %@",str);
}
//3) 使用block的方式,进行访问
// id obj数组元素 idx:元素下标 stop:是否停止
// stop:YES 会停止, stop:NO
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"idx = %ld,obj = %@",idx,obj);
}];
//4)
}
return 0;
}
打印结果
-> one
-> two
-> three
-> four
---> one
---> two
---> three
---> four
idx = 0,obj = one
idx = 1,obj = two
idx = 2,obj = three
idx = 3,obj = four
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (idx == 2) {
*stop = YES; //下标为第二个数 停止遍历 // break;
} else
{
NSLog(@"idx = %ld,obj = %@",idx,obj);
}
}];
打印结果
idx = 0,obj = one
idx = 1,obj = two
4.NSArray读写文件
NSArray *array = [NSArray arrayWithObjects:@"one",@"two",@"three", @"four",@"five",nil];
// 把NSArray 中的内容,写入到文件中
// arr.plist 一种特殊的文件格式 或者为.xml格式
// [array writeToFile:@"file:///Users/zhaoxiaohu/Desktop/arr.plist" atomically:YES];
// atomically:YES BOOL值,需要接收一下 修正为
BOOL isWrite = [array writeToFile:@"Users/zhaoxiaohu/Desktop/arr.plist" atomically:YES];
if (isWrite) {
NSLog(@"写入成功");
// 从文件中,读取一个数组信息
NSArray *readArr = [NSArray arrayWithContentsOfFile:@"Users/zhaoxiaohu/Desktop/arr.plist"];
NSLog(@"readArr = %@",readArr);
}
4.NSArray与字符串
把数组元素链接成字符串
- (NSString *)compomentsJoinedByString:(NSString *)separator:
这是NSArray的方法,用separator作拼接符将数组元素拼接成一个字符串
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建一个数组 @1快速转化成对象
NSArray *arr = @[@1,@2,@3,@4];
// 1)需求:把数组中的元素用 “-” 连接起来
// [数组 componentsJoinedByString];
// 1-2-3-4
// [arr componentsJoinedByString:@"-"];
NSString *str = [arr componentsJoinedByString:@"-"];
NSLog(@"str = %@",str);
// 2)给一个字符串,分割成一个数组
// 400-800-12580 //取得400 12580 800
// componentsSeparatedByString 返回值是NSArray
NSString *str2 = @"400-800-12580";
NSArray *arr2 = [str2 componentsSeparatedByString:@"-"];
NSLog(@"%@",[arr2 firstObject]);
NSLog(@"%@",[arr2 lastObject]);
NSLog(@"%@",arr2[1]);
}
return 0;
}
打印结果
str = 1-2-3-4
400
12580
800
NSString *str2 = @"400-800-12580#400-888-11200";
NSArray *arr3 = [str2 componentsSeparatedByString:@"#"];
NSLog(@"arr3 = %@",arr3);
// [[arr3 firstObject] componentsSeparatedByString:@"-"];
// 第一个电话的每一部分
NSArray *arr4 = [[arr3 firstObject] componentsSeparatedByString:@"-"];
NSLog(@"arr4 = %@",arr4);
NSArray *arr5 = [[arr3 lastObject] componentsSeparatedByString:@"-"];
NSLog(@"arr5 = %@",arr5);
打印结果
arr3 = (
"400-800-12580",
"400-888-11200"
)
arr4 = (
400,
800,
12580
)
arr5 = (
400,
888,
11200
)
NSDictionary(16)
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//NSDictionary 不可变的,一旦创建,内容就不能添加/删除(不能改变)
//1)创建空字典
NSDictionary *dict1 = [NSDictionary dictionary];
//key value
// zs ---> 张三 汉字会打印汉字编码
// ls ---> 李四
// mz --->码子
//2)创建只有一组键值对的字典
//object:对象 forkey:键值
NSDictionary *dict2 = [NSDictionary dictionaryWithObject:@"zhangsan" forKey:@"zs"];
//3)创建多组键值对的字典
// value值,key值
NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2", nil];
// 注意:
// 字典的key值和value值,都必须是对象
//4)快速创建一个字典
// @{,,key值:value值,,,};
//key值不能重复
//如果重复了,也不会报错
//如果重复了,最后添加的将不能够保存到字典中
NSDictionary *dict4 = @{@"zs":@"zhangsan",@"ls":@"lisi",@"bz":@"banzhang"};
NSLog(@"%@",dict2); //以%@格式打印字典,控制台输出一个{ }
NSLog(@"%@",dict3);
NSLog(@"%@",dict4);
}
return 0;
}
打印结果
{
zs = zhangsan;
}
{
key1 = value1;
key2 = value2;
}
{
bz = banzhang;
ls = lisi;
zs = zhangsan;
}
键值对集合的特点
1.字典存储的时候,必须是“键值对”的方式来存储(同时键不要重复)
2.键值对中存储的数据是”无序的”
3.键值对集合可以根据键,快速获取数据
NSDictionary基本使用方法
- (NSUInteger)count;
// 返回字典的键值对数目
- (id)objectForKey:(id)aKey;
// 根据key取出value
NSDictionary遍历方法
//5)获取字典的长度
NSLog(@"%lu", dict4.count);
//6)根据key值(zs)取出value值(zhaosi)
NSString *str = [dict4 objectForKey:@"zs"];
NSLog(@"zs = %@",str);
//7)字典的遍历问题
//第一步:获取所有的key
//第二步:根据key获取value
// for (NSString *key in dict4) {
// NSLog(@"key = %@",key);
// }
for (NSString *key in dict4) {
NSLog(@"key = %@,value = %@",key,[dict4 objectForKey:key]);
}
}
打印结果
NS系列[1295:58726] 3
NS系列[1295:58726] zs = zhangsan
key = ls,value = lisi
key = bz,value = banzhang
key = zs,value = zhangsan
// key:key obj:value stop:stop
[dict4 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL * stop) {
NSLog(@"%@ ---> %@",key,obj);
}];
打印结果
ls ---> lisi
bz ---> banzhang
zs ---> zhangsan
NSDictionary的简写及文件操作
简写形式
// 以前
[NSDictionary dictionaryWithObjectsAndKeys:@"Jack":@"name",@"男":@"sex",nil];
// 现在
@{@"name":@"Jack",@"sex":@"男"};
NSDictionary获取元素
// 以前
[dict objectForKey:@"name"];
// 现在
dict [@"name"];
//1)用简写形式定义一个字典
NSDictionary *dict = @{@"zbz":@"zhangbozhi",@"cgx":@"chenguanxi"};
//2)用简写形式,获取key对应的value
NSLog(@"%@",dict[@"zbz"]);
打印结果
zhangbozhi
NSDictionary文件操作
将字典写入文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
//1)用简写形式定义一个字典
NSDictionary *dict = @{@"zbz":@"zhangbozhi",@"cgx":@"chenguanxi"};
//2)用简写形式,获取key对应的value
NSLog(@"%@",dict[@"zbz"]);
//3)把字典保存到文件中 返回值是BOOL型
BOOL isWrite = [dict writeToFile:@"/Users/fc/dict.plist" atomically:YES];
if (isWrite) {
NSLog(@"写入成功");
}
//4)从文件中读取字典
NSDictionary *readDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/fc/dict.plist"];
NSLog(@"readDict = %@",readDict);
打印结果
NS系列[692:17996] zhangbozhi
NS系列[692:17996] 写入成功
NS系列[692:17996] readDict = {
cgx = chenguanxi;
zbz = zhangbozhi;
}
// 省 市
// 辽宁省 大连
// 沈阳
// 河北省 保定
// 石家庄
//
NSArray *lnArr = [NSArray arrayWithObjects:@"dalian",@"shenyang", nil];
NSArray *hbArr = [NSArray arrayWithObjects:@"baoding",@"shijiazhuangn", nil];
NSDictionary *cities = [NSDictionary dictionaryWithObjectsAndKeys:lnArr,@"ln",hbArr,@"hb", nil];
NSLog(@"cities = %@",cities);
// 创建离线数据库(字典)
[cities writeToFile:@"/Users/fc/cities.plist" atomically:YES];
/*
ln = (dalian,shenyang)
hb = (baoding,shijiazhuang)
*/
打印结果
cities = {
hb = (
baoding,
shijiazhuangn
);
ln = (
dalian,
shenyang
);
}
#import <Foundation/Foundation.h>
void test() {
// 省 市
// 辽宁省 大连
// 沈阳
// 河北省 保定
// 石家庄
//
NSArray *lnArr = [NSArray arrayWithObjects:@"dalian",@"shenyang", nil];
NSArray *hbArr = [NSArray arrayWithObjects:@"baoding",@"shijiazhuangn", nil];
NSDictionary *cities = [NSDictionary dictionaryWithObjectsAndKeys:lnArr,@"ln",hbArr,@"hb", nil];
NSLog(@"cities = %@",cities);
[cities writeToFile:@"/Users/fc/cities.plist" atomically:YES];
/*
ln = (dalian,shenyang)
hb = (baoding,shijiazhuang)
*/
}
// 遍历数组
int main(int argc, const char * argv[]) {
@autoreleasepool {
//读取cities.plist
NSDictionary *citiesDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/fc/cities.plist"];
[citiesDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"key:%@, value:%@",key,obj); //obj是数组
}];
}
return 0;
}
打印结果
key:hb, value:(
baoding,
shijiazhuangn
)
key:ln, value:(
dalian,
shenyang
)
//读取cities.plist
NSDictionary *citiesDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/fc/cities.plist"];
[citiesDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// NSLog(@"key:%@, value:%@",key,obj);
for (NSString *str in obj) {
NSLog(@"city = %@",str);
}
// 获取每个数组 citiesDict[@"ln"];
NSArray *arr = citiesDict[@"ln"];
NSLog(@"arr = %@",[arr lastObject]);
}];
打印结果
city = baoding
city = shijiazhuangn
city = dalian
city = shenyang
arr = shenyang
NSMutableDictionary 常用方法
- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
//添加一个键值对
- (void)removeObjectForKey:(id)aKey:
//通过aKey删除对应的value
- (void)removeAllObjects;
//删除所有键值对
[dict setObject:@"Jack" forKey:@"name"];
//现在
dict[@"name"] = @"Jack";
//1)可变字典的创建
NSMutableDictionary *dict1 = [NSMutableDictionary dictionary]; //创建空字典
NSMutableDictionary *dict2 = [NSMutableDictionary dictionaryWithCapacity:3];
//2)给可变字典添加键值对
[dict1 setValue:@"lisi" forKey:@"ls"]; //键值key重复,lisi添加失败
[dict1 setValue:@"zhaosi" forKey:@"ls"];
[dict1 setValue:@"liuneng" forKey:@"ln"];
NSLog(@"%@",dict1);
//3)删除
[dict1 removeObjectForKey:@"ls"];
NSLog(@"%@",dict1);
[dict1 removeAllObjects];
NSLog(@"%@",dict1);
打印结果
NS系列[1344:45729] {
ln = liuneng;
ls = zhaosi;
}
NS系列[1344:45729] {
ln = liuneng;
}
NS系列[1344:45729] {
}
//4)修改
[dict1 setObject:@"lisi" forKey:@"ls"];
// 简写形式
dict1[@"ls"] = @"xxxxx";
NSLog(@"%@",dict1);
//5)查找
// [dict1 allKeys]; allKeys返回值为NSArray
NSArray *arr = [dict1 allKeys];
if ([arr containsObject:@"ls"]) {
NSLog(@"存在ls的key");
}
打印结果
NS系列[1488:50013] {
ln = liuneng;
ls = xxxxx;
}
NS系列[1488:50013] 存在ls的key
NSDictionary和NSArray 对比
*NSArray 是有序的,NSDictionary是无序的
*NSArray 是通过下标访问元素,NSDictionary是通过key访问元素
NSAray 的用法
// 创建
@[@"Jack", @"Rose"] (返回值是不可变数组)
// 访问
id d = array[1]
// 赋值
array[1] = @"jack"
NSDictionary 的用法
// 创建
@{@"name":@"Jack",@"phone":@"10086"} (返回是不可变字典)
// 访问
id d = dict[@"name"]
// 赋值
dict[@"name"] = @"jack"