字典
主要知識點:
1.NSDictionary 類
2.NSMutableDictionary 類
3.了解NSMutableDictionary 與 NSDictionary 的繼承關系
4.補充:
散列存儲:又稱hash存儲,是一種力圖將數據元素的存儲位置與關鍵碼之間建立確定對應關系的查找技術。散列法存儲的基本思想是:由節點的關鍵碼值決定節點的存儲地址。散列技術除了可以用於查找外,還可以用於存儲。
散列是數組存儲方式的一種發展,相比數組,散列的數據訪問速度要高於數組,因為可以依據存儲數據的部分內容找到數據在數組中的存儲位置,進而能夠快速實現數據的訪問,理想的散列訪問速度是非常迅速的,而不像在數組中的遍歷程,采用存儲數組中內容的部分元素作為映射函數的輸入,映射函數的輸出就是存儲數據的位置,這樣的訪問速度就省去了遍歷數組的實現,因此時間復雜度可以認為為O(1),而數組遍歷的時間復雜度為O(n)。
=========== NSDictionary不可變字典 ================
1、什么是字典(key-value)
字典是也是一種集合結構,功能與我們現實中的字典工具一樣
2、字典的元素是什么
任意類型的對象地址構成鍵值對
3、什么是鍵值對
鍵值對是由key和value構成必須一一對應
鍵值對中的key必須保證是唯一的
4、字典的存儲方式
字典是一種無序保存的集合
5、如何查找值
根據鍵值對中的key找到相應的值
================================================
1. NSDictionary(不可變)的創建
1) 如何創建一個字典對象
(1)創建空字典(不用)
NSDictionary *dic = [[NSDictionary alloc] init];
dic = [NSDictionary dictionary];
(2)創建帶有對象的字典
/*
1.一對鍵值對(key-value)
@"key1" = @"1111"
*/
dic = [NSDictionary dictionaryWithObject:@"1111" forKey:@"key1"];
/*
2.有多個鍵值對
*/
NSArray *objArray = @[@"value1",@"value2"];
NSArray *keyArray = @[@"key1",@"key2"];
dic = [NSDictionary dictionaryWithObjects:objArray forKeys:keyArray];
/*
3.有多個鍵值對(另外寫法)
*/
dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];
NSLog(@"%@",dic);
/*
4.拷貝指定字典的鍵值對,返回一個新的字典
*/
[NSDictionary dictionaryWithDictionary:<#(NSDictionary *)#>];
/*
5.快速創建
公式(鍵值對以","分隔):
@{key:value,key:value...}
*/
dic = @{};//創建一個空字典
dic = @{@"key1":@"value",@"key2":@"value2",@"key6":@"value6"};
2、獲取鍵值對個數
[dic count]
3、如何通過key獲取對應的value
(1)[dic objectForKey:@“key”];字典方法
id obj = [dic valueForKey:@"key3”];字典方法
[arr objectAtIndex:index];數組方法
(2)obj = dic[@"key2"];
注意:A[B] 如果B是整數,A是數組,
如果B是字符串,A就是字典
4、獲取字典中所有的key
[dic allKeys]
5、獲取字典中所有的value
[dic allValues]
6.把字典寫入到指定文件中
dic writeToFile:path atomically:YES];
7.從文件里面讀取字典數據
[NSDictionary dictionaryWithContentsOfFile:path];
8、遍歷字典內容
1)枚舉器法:
<1>鍵的遍歷:
keyEnumerator消息
作用:獲取所有的key值
NSEnumerator *emunerator = [dict keyEnumerator];
id obj;
while (obj = [emunerator nextObject]) {
NSLog(@“%@“, obj);
}
<2>值得遍歷
objectEnumerator 消息
2)快速枚舉法:得到的是鍵
for (id key in dict)
{
NSLog(@“key — %@, value = %@, key, [dict objectForKey:obj]); // 得到了鍵就得到了值
}
9.NSDictionary和NSArray的對比
1)字典相對與數組的優點
字典獲取元素速度比數組快,原因是字典通過哈希算法得到每個元素具體的位置
2)獲取元素的方式
數組通過下標獲取指定元素的內容 objectAtIndex
字典通過key來獲取指定元素的內容 objectForKey
============NSMutableDictionary可變字典================
1、NSMutableDictionary和NSDictionary的區別
2、如何創建
//初始化一個空字典
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
dic = [[NSMutableDictionary alloc] init];
3、增加鍵值對
/*
(1)key是唯一的,value可以一樣。
(2)添加鍵值對的時候,如果key存在,會替換原來的值(替換)。如果key不存在,添加一個鍵值對(添加)。
*/
(1)[dic setObject:@"value1" forKey:@"key1"];
注意:不存在鍵或者鍵已存在
不存在會保存失敗,且會導致程序奔潰,存在則會覆蓋
4.在當前字典中添加另外一個字典的內容
/*
dic2里面鍵值對添加到dic1
[A addEntriesFromDictionary:B] 把B里面鍵值對添加字典A里面,如果B里面key如果A里面存在相同的key的話也會替換value.
*/
[dic1 addEntriesFromDictionary:dic2];
[dic1 setValuesForKeysWithDictionary:dic3];
5.可變字典的刪除
1)通過指定key刪除一組鍵值對
[dic1 removeObjectForKey:@"key1"];
2)通過指定多個key來刪除相關的鍵值對
[dic1 removeObjectsForKeys:@[@"key1",@"key2",@"key4"]];
3)刪除字典中所有的鍵值對
[dic1 removeAllObjects];
6、修改
1) 修改整個字典
[dic1 setDictionary:dic3];
2) 修改鍵值對
[dic1 setObject:<#(id)#> forKey:@“字典存在的key”];