字典类
键值对:key-value
键值对,用一个比喻来说,就是有一堆杂乱的,无序的货物,要怎么样去找到某个货物,并把货物拿出来。那么这里就要用标签去给货物贴上,这样就能在这堆货物里,通过标签,找到自己想要的货物了。
键值对就是类似于这样的存在,我们用一个键key来保存名字,用value来保存实际的值,这样就可以直接通过这个key来取到这个值value。
key相当于货物的标签,value相当于实际的货物。
注意:一堆数据里,key不能重复。
不可变字典NSDictionary:
字典是用来保存具有key-value这样关系的数据的集合的容器。在字典里,key的值在oc里写的时候,可以写重复,但是,在存入对象的时候,相同的key只保存第一个。(严格来说,key的值不能重复)。NSDictionary一旦创建,就不可以修改,不能添加,不能删除,只能通过key来读取value的值。
字典的存放顺序,不是按照个人的意愿进行存放的。而是按照hash算法算出来的值,然后存放的。
字典的创建:initWithObjectsAndKeys
//2015年04月17日11:16:18 北京 //字典 //键值对:(key-value) //key(键):相当于贴在货物上得标签 //value(值):相当于货物 //通过标签找货物相当于通过key找到value //NSDictionary(不可变字典) //value可以重复 //key不能重复(写成重复可以,但是不能存进字典) //根据哈希(hash)算出来的值的顺序存放的。 NSDictionary *dict1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"value_hello world",@"key_A", @"value_this is a place put value",@"key_B",@"value_Biger then Bigger",@"B",@"CCC",@"C",nil];//以nil作为结束标志 NSLog(@"%@",dict1);/* 2015-04-17 11:30:36.976 OCLesson5_字典[1168:55441] { B = "value_Biger then Bigger"; C = CCC; "key_A" = "value_hello world"; "key_B" = "value_this is a place put value"; } */ //A:1,B:2,C:3,D:4 NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"A",@"2",@"B",@"3",@"C",@"4",@"D", nil]; NSLog(@"%@",dict2);/* 2015-04-17 11:35:28.484 OCLesson5_字典[1199:56836] { A = 1; B = 2; C = 3; D = 4; } */ |
initWithObjectsAndKeys这个方法是其中一个初始化字典的方法,这个方法在初始化的时候,按一对存取,前边是value,后边是key。以nil作为结束标志。
两个数组创建一个字典:dictionaryWithObjects forKeys
这个其实是调用了便利构造器。dictionaryWithObjects这个方法,参数有两个,前边参数是放value得数组,后边的参数是放key的数组。
//两个数组创建一个字典 NSArray *valueArr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil]; NSArray *keyArr = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D", nil]; NSDictionary *dict3 = [NSDictionary dictionaryWithObjects:valueArr forKeys:keyArr]; NSLog(@"%@",dict3);/* 2015-04-17 11:42:01.087 OCLesson5_字典[1238:58650] { A = 1; B = 2; C = 3; D = 4; } */ |
通过key取值:
//两个数组创建一个字典 NSArray *valueArr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil]; NSArray *keyArr = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D", nil]; NSDictionary *dict3 = [NSDictionary dictionaryWithObjects:valueArr forKeys:keyArr]; //通过key取值 (key的value值) NSString *s1 = [dict3 objectForKey:@"C"]; NSLog(@"%@",s1);//2015-04-17 11:44:54.895 OCLesson5_字典[1254:59540] 3 |
count:计算键值对个数
//count说的是键值对的个数,不是key有多少个,value有多少个。 NSUInteger u1 = [dict3 count]; NSLog(@"%lu",u1);//2015-04-17 11:46:50.807 OCLesson5_字典[1268:60069] 4 |
获取所有key,获取所有value
//获取所有的key,返回一个数组,里边是所有的key NSArray *keysArr = [dict3 allKeys]; //获取所有的value,返回一个数组,里边是所有的value NSArray *valuesArr = [dict3 allValues]; NSLog(@"%@",keysArr);/*2015-04-17 11:51:31.940 OCLesson5_字典[1289:61531] ( A, D, B, C )*/ NSLog(@"%@",valuesArr);/*2015-04-17 11:51:31.940 OCLesson5_字典[1289:61531] ( 1, 4, 2, 3 ) */ |
注意:
1、字典与数组一样,不能存标量(基本数据类型数据),只能通过NSNumber来把基本数据类型转换成对象,才能存进字典。
2、字典中得所有key不能重复。
3、字典的key是id类型(任意类型(前提是遵守NSCopying协议)),value也是id类型。
4、遵守NSCopying协议
5、不要考虑存放顺序的问题。
一个练习:
打印所有value的值:(1、allValues 2、allKeys + objectForKey)
//练习:dict3打印所有的value值(2种方式) NSArray *temp1 = [dict3 allValues]; for (int i = 0; i < [temp1 count]; i++) { NSLog(@"%@",temp1[i]); } NSArray *temp2 = [dict3 allKeys]; for (int i = 0; i < [temp2 count]; i++) { NSLog(@"%@",[dict3 objectForKey:temp2[i]]); } |
可变字典NSMutableDictionary
初始化用init即可
NSMutableDictionary *mdict1 = [[NSMutableDictionary alloc]init]; |
设置字典:(字典的添加用set,数组用add)
//设置 [mdict1 setObject:@"apple" forKey:@"T1"]; [mdict1 setObject:@"苹果" forKey:@"T2"]; NSLog(@"%@",mdict1);/* 2015-04-17 14:55:50.335 OCLesson5_字典[1615:87301] { T1 = apple; T2 = "\U82f9\U679c"; } */ |
删除字典:
[mdict1 removeObjectForKey:@"T1"]; NSLog(@"%@",mdict1);/* 2015-04-17 14:56:44.512 OCLesson5_字典[1625:87641] { T2 = "\U82f9\U679c"; } */ |
修改字典:
//改 [mdict1 setObject:@"banana" forKey:@"T2"]; NSLog(@"%@",mdict1);/* 2015-04-17 14:58:59.068 OCLesson5_字典[1639:88252] { T2 = banana; } */ |
取值:
//查 [mdict1 objectForKey:@"T2"]; |
清空字典:
//清空字典 [mdict1 removeAllObjects]; |