字典
前言
字典其实在理解了数组之上去看的话,是非常容易的。数组是一个一个数出现的,而字典是一对一对“数”出现的,这个“一对数”就是键值对。但是我们要注意,字典是集合,集合是无序的。而其实还有一个类型叫set集合,它也是无序的,因为它是单值无重复的集合。而且他们都有可变和不可变之分,我们把字符串、数组、字典还有set集合一起对比着学,就会容易记住了。
不可变字典 NSDictionary
1.概念:
字典是关键字“key”及其定义的值(value)所构成的集合,即它是由key-value组成的键值对的集合。‘key’一般是‘NSString’类型的,‘value’是OC中任意对象。对于字典来讲,我们就是通过‘key’来访问‘value’。
2.为什么在有了数组之后,还需要字典?
在有大量的数据或频繁的查找的时候,使用字典效率更高。因为字典采用键查询的优化查询方式。
初始化
创建一个空的字典
NSDictionary *dictionary1=[[NSDictionary alloc]init];
NSDictionary *dictionary2=[NSDictionary dictionary];
NSDictionary *dictionary3=[NSDictionary dictionaryWithObject:@"Rick" forKey:@"name"];
创建一个多个键值对的字典
NSDictionary *dictionary4=[NSDictionary dictionaryWithObjectsAndKeys:@"Rick",@"name",@25,@"age",@"G2",@"address",nil];
字典里面存放的元素都要是对象类型才可以,如果是基本数据类型,要先把基本数据类型进行封装,然后再放到这些集合中去。
NSDictionary *dictionary5=[NSDictionary dictionaryWithDictionary:dictionary4];
NSLog(@"%@",dictionary5);
新语法创建字典
NSDictionary *dictionary6=@{};
新语法创建只有一个键值对的字典。
NSDictionary *dictionary7=@{@"name":@"Rick"};
新语法创建只有一个键值对的字典。
NSDictionary *dictionary8=@{@"name":@"Rick",@"age":@25,@"address":@"G2p"};
从本地读取字典
NSDictionary *dictionary9=[NSDictionary dictionaryWithContentsOfFile:@""];
从网络读取字典
NSDictionary *dictionary10=[NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]];
字典中键值对的数量
NSUInteger count=[dictionary4 count];
如何访问字典?
通过key访问字体中对应的值
NSString *name=[dictionary4 objectForKey:@"name"];
新语法
NSString *newname= dictionary4[@"name"];
如何访问字典中的key/value
表示字典中所有的key
NSArray *keysArray=dictionary4.allKeys;
NSArray *valuesArray=dictionary4.allValues;
for (int i=0; i<dictionary4.count; i++) {
NSLog(@"%@ = %@",keysArray[i],valuesArray[i]);
}
//forin
for (NSString *key in keysArray) {
NSLog(@"%@ = %@",key,dictionary4[key]);
}
使用枚举器遍历
NSEnumerator *enumerator =[keysArray objectEnumerator];
id key;
while(key = [enumerator nextObject]){
NSLog(@"%@ =%@",key,dictionary4[key]);
}
NSDictionary *dictionary=@{@"name":@"Rick",@"age":@25,@"address":@"G2p" ,@"name":@"Jack"};
for (NSString *str in dictionary.allKeys) {
NSLog(@"%@ = %@",str,dictionary[str]);
}
可变字典 NSMutableDictionary
1.初始化
创建一个空的字典
NSMutableDictionary *mDictionary1 =[NSMutableDictionary dictionary];
创建一个有一个键值对的可变字典
NSMutableDictionary *mDictionary2=[NSMutableDictionary dictionaryWithObject:@"Rick" forKey:@"name"];
NSMutableDictionary *mDictionary3=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"Rick",@"name",@25,@"age",@"GZ",@"address", nil];
通过一个字典创建一个字典
NSMutableDictionary *mDictionary4=[NSMutableDictionary dictionaryWithDictionary:mDictionary3];
//mDictionary4.allKeys
//mDictionary4.allValues
可变字典独有的初始化方法
NSMutableDictionary *mDictionary5=[NSMutableDictionary dictionaryWithCapacity:10];
从本地读取字典
NSMutableDictionary *mDictionary6=[NSMutableDictionary dictionaryWithContentsOfFile:@""];
从网络读取字典
NSMutableDictionary *mDictionary7=[NSMutableDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]];
操作字典
增
[mDictionary5 setValue:@"Rick" forKey:@"name"];
[mDictionary5 setValue:@25 forKey:@"age"];
改
(如果原来的字典中已经有了akey这个值,那么这次新加的值就会覆盖原来的关键字(键)akey对应的值。还是一样的命令,后面的值会把前面的覆盖掉)
[mDictionary5 setValue:@"Jack" forKey:@"name"];
mDictionary5[@"name"]=@"Leo";
删除
删除指定key的对象
[mDictionary5 removeObjectForKey:@"name"];
删除所有的对象
[mDictionary5 removeAllObjects];
找出相同值的键
NSMutableDictionary *mDic8=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"Rick",@"name",
@25,@"age",
@"GZ",@"address",
@"Rick",@"name2",
@"Rick",@"name3",nil];
NSArray *keysArray=mDic8.allKeys;
NSArray *valuesArray=mDic8.allValues;
方法一
for(int i=0;i<mDic8.count;i++){
if(valuesArray[1] ==valuesArray[i]){
NSLog(@"%@",keysArray[i]);
}
if([valuesArray[i] isKindOfClass:[NSNumber class]]){
int age=[valuesArray[i] intValue];
mDic8[@"name"]=[NSString stringWithFormat:@"%d",age];
}
}
方法二
for (NSString *key in keysArray) {
NSString *string;
if([mDic8[key] isKindOfClass:[NSNumber class]]){
int age=[mDic8[key] intValue];
mDic8[key]=[NSString stringWithFormat:@"%d",age];
}
else{
string =mDic8[key];
}
if([string isEqualToString:@"Rick"]){
NSLog(@"");
}
}