NSDictionary
1、什么是字典
字典是也是一种集合结构,功能与我们现实中的字典工具一样
2、字典的元素是什么
任意类型的对象地址构成键值对
3、什么是键值对
键值对是由key和value构成必须一一对应
键值对中的key必须保证是唯一的
4、字典的存储方式
字典是一种无序保存的集合
5、如何查找值
根据键值对中的key找到相应的值
================================================
NSDictionary的创建
1)如何创建一个字典对象
//实例化方法
-(id)initWithObjectsAndKeys: (id)object,…;
-(id)initWithDIctionary:(NSDictionary*)otherDictionary;
-(id)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
//类方法创建
+(id)dictionaryWithObjectsAndKeys:(id)object,….;
+(id)dictionaryqWithDictionary:(NSDictionary *)dict;
+(id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
//创建2
NSDictionary *dic = @{@“1”: @“one”, @“2”:@“two”};
//字典中的元素是以键值对的形式存储
//@"One" 和 @"1" 组成了一个键值对
//@"One"称为值(value)@"1" 称为键
//键值对的键和值,都是任意的对象,但是键往往使用字符串
//字典和数组都是存贮对象地址,
//字典存储对象的地址没有顺序
//key不能重复
2、获取键值对个数
- (NSUInteger)count;
3、如何通过key获取对应的value(值是目的, 键是手段)
- (id)objectForKey:(id)aKey;
或者是: dic[@“1”];
4、获取字典中所有的key
-(NSArray *)allKeys;
5、获取字典中所有的值
-(NSArray *)allValues;
6、获取值是anObject的所有的key
-(NSArray *)allKeyForObject:(id)anObject;
7、如何遍历字典内容
枚举器法:
键的遍历:
1)keyEnumerator消息
作用:获取所有的key值
NSEnumerator *emunerator = [dict keyEnumerator];
id obj;
while (obj = [emunerator nextObject]) {
NSLog(@“%@“, obj);
}
值得遍历
objectEnumerator 消息
快速枚举法:
快速枚举法:得到的是键
for (id key in dict)
{
NSLog(@“key — %@, value = %@, key, [dict objectForKey:obj]); // 得到了键就得到了值
}
5.NSDictionary和NSArray的对比
1)字典相对与数组的优点
字典获取元素速度比数组快,原因是字典通过哈希算法得到每个元素具体的位置
2)获取元素的方式
数组通过下标获取指定元素的内容 objectAtIndex
字典通过key来获取指定元素的内容 objectForKey 不能通过下标
dict[@“1”]
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { /* NSDictionary: 字典,用来存储数据 数据 是以键值对的方式存在 键(索引) --------- 值 1 = one; 2 = two; 3 = three; 键和值可以是任意的对象, 一般【键】都是以【字符串】的形式表示 字典的存储顺序,不是按照初始化的方法来存储,按照存储速度最快的方式 的方式来存储-----------哈希算法(散列的算法) 【注】键唯一,值可以不唯一 */ NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"two",@"2",@"three",@"3", @"one",@"1", nil]; NSLog(@"dict = %@", dict); NSDictionary *dict1 = [[NSDictionary alloc] initWithDictionary:dict]; NSString *objArr[] = {@"zhangfei",@"liubei",@"guanyu"}; NSString *keyArr[] = {@"xiaohei",@"xiaobai",@"xiaohong"}; NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:objArr forKeys:keyArr count:3]; NSLog(@"dict2 = %@", dict2); //键不能相同,值可以相同 NSDictionary *dict3 = [NSDictionary dictionaryWithObjects:@[@"zhangfei",@"liubei",@"guanyu",@"zhangfei"] forKeys:@[@"xiaohei",@"xiaobai",@"xiaohong",@"laosan"]]; NSLog(@"dict3 = %@", dict3); //____________常用的方法_____________________ //_______获取键值对的个数________ NSUInteger len = [dict3 count]; NSLog(@"len = %lu", len); //_______根据键获取值_键是手段,值才是目的____ //objectForKey:(id)key id obj = [dict3 objectForKey:@"xiaohei"]; NSLog(@"obj = %@", obj); //可以使用 [] id obj2 = dict3[@"xiaohong"]; NSLog(@"obj2 = %@", obj2); //_______获取所有的key____________ NSArray *allKeys = [dict3 allKeys]; NSLog(@"allKeys = %@", allKeys); //_______获取所有的值_____________ NSArray *allObjects = [dict3 allValues]; NSLog(@"allObjects = %@", allObjects); //_______根据值获取所有的键_________ NSArray *allKeyForObj = [dict3 allKeysForObject:@"zhangfei"]; NSLog(@"allKeyForObj = %@", allKeyForObj); //_______遍历字典__________________ //___枚举器____既可以遍历key,也可以遍历value NSEnumerator *keys = [dict3 keyEnumerator]; NSString *key = nil; while (key = [keys nextObject]) { NSLog(@"key-----%@, value------%@", key, dict3[key]); } //枚举所有的值 NSEnumerator *values = [dict3 objectEnumerator]; id obj3 = nil; while (obj3 = [values nextObject]) { NSLog(@"value = %@", obj3); } //_____快速枚举法______得到的是key____ for (id obj in dict3) { NSLog(@"key---%@, value----%@", obj,dict3[obj]); } } return 0; }
============================
NSMutableDictionary
1、NSMutableDictionary和NSDictionary的区别
2、如何创建
1)dictionary消息
作用:创建一个空的字典
2)dictionaryWithObjects:forKeys: 消息
作用:通过指定数组来创建一个字典对象
3、增加键值对
-(void)setObject:(id)anObject forKey:(id)akey;
备注:如果不存在键——添加
如果键已存在—--修改
4.可变字典的删除
1)通过指定key删除一组键值对
-(void)removeObjectForKey:(id)aKey;
2)通过指定的一个数组内容来删除相关的键值对
-(void)removeObjectsForKeys:(NSArray *)keyArray;
3)删除字典中所有的键值对
-(void)removeAllObjects;
5、修改
修改整个字典
- (void)setDictionary;(NSDictionary *)otherDictionary;
修改键值对
- (void)setObject:(id)anObject forKey:(id)
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // NSMutableDictionary 是 NSDictionary 的子类 //@[] NSDictionary *dict = @{@"1": @"one", @"2":@"two",@"3":@"three"}; NSMutableDictionary *dict1 = [[NSMutableDictionary alloc] initWithObjects:@[@"one",@"two"] forKeys:@[@"1",@"2"]]; //创建空字典 NSMutableDictionary *dict2 = [NSMutableDictionary dictionary]; NSLog(@"dict2 = %@", dict2); //_______添加键值对___________ [dict2 setObject:@"zhangsan" forKey:@"1"]; [dict2 setObject:@"lisi" forKey:@"2"]; [dict2 setObject:@"wangwu" forKey:@"3"]; NSLog(@"dict2 = %@", dict2); [dict2 setObject:@"zhaoping" forKey:@"6"]; [dict2 removeObjectForKey:@"1"]; //_______删除键值对_______________ [dict2 removeObjectForKey:@"1"]; NSLog(@"dict2 = %@", dict2); //将字典的key和数组相同的元素的键值对删除 [dict2 removeObjectsForKeys:@[@"2",@"5"]]; NSLog(@"dict2 = %@", dict2); [dict2 setObject:@"nimei" forKey:@"4"]; //_______改______set的键和已有的键相同_____ [dict2 setObject:@"laowu" forKey:@"3"]; NSLog(@"dict2 = %@", dict2); //__重置____ [dict2 setDictionary:dict]; NSLog(@"dict2 = %@", dict2); } return 0; }
/*************************************************************************
NSDictionary
****************************************************************************/
//内容可以是任意的对象指针 //内容是一些键值对 key value //必须成对出现 一个 key 对应一个 value //key 是唯一的 不能出现多个相同的 key
1.创建一个不可变字典(1)
NSDictionary*dict=[[NSDictionary
alloc]initWithObjectsAndKeys:@"1",@"one",@"2",@"two",@"3",@"three",@"4",
@"four",@"5",@"five", nil];//
创建一个不可变字典(2)
NSDictionary * dict1 = [NSDictionary dictionaryWithDictionary:dict];
创建一个不可变字典(3)
NSArray * values =[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"4", nil];
NSArray*keys=[[NSArray
alloc]initWithObjects:@"one",@"two",@"three",@"four", nil];
NSDictionary* dict2 = [[NSDictionary alloc]initWithObjects:values forKeys:keys];
//键值对的个数
NSLog(@"count = %ld",[dict2 count]);
//查找 通过 key 找到对应值
NSLog(@"%@",[dict objectForKey:@"four"]);
词典类的存在就是为了解决在大量数据中查找方便,因为它是通过 key 直接找到
value 所以速度很快,避免一个个的遍历寻找造成的效率低下,善用字典类会帮
你的程序提速。
//创建 key 的枚举器
NSEnumerator * keyenumer = [dict keyEnumerator];
while (obj = [keyenumer nextObject]) {
NSLog(@"obj = %@",obj); }
//快速枚举枚举的是 key for (id od in dict) {
NSLog(@"od = %@",od); }
/*******************************************************************************
NSMutableDictionary
*******************************************************************************
/ NSMutableDictionary 是NSDictionary的子类,所以继承了NSDictionary的方法。
//创建可变字典
NSMutableDictionary*dict=[[NSMutableDictionary
alloc]initWithObjectsAndKeys:@"1",@"one",@"2",@"two",@"3",@"three",@"4",
@"four", nil];
NSMutableDictionary*dict1 =[NSMutableDictionary dictionaryWithCapacity:10] :
创建一个可变词典初始指定它的长度为 10.,动态的添加数据如果超过 10 这个
词典长度会自动增加,所以不用担心数组越界。
//增加 删除 修改
[dict setObject:@"5" forKey:@"five"];//字典中不存在@“five”key 那么就是增
加键值对
[dict setObject:@"7" forKey:@"one"];//字典中存在@“one”key 那么就是修改@
“one”对应的值
[dict removeObjectForKey:@"one"];//删除键值对
- (void)removeAllObjects;//删除所有键值对
- (void)removeObjectsForKeys:(NSArray *)keyArray;//删除keys
数组对应的键值对
- (void)setDictionary:(NSDictionary *)otherDictionary;//修
改字典