Objective-C學習篇08—NSDictionary與NSSet,nssetnsdictionary
NSDictionary與NSMutableDictionaryNSSet與NSMutableSte
字典
字典:字典分為可變字典NSDictionary和不可變字典NSMutableDictionary.字典中的資料都是以索引值對的形式儲存的,鍵和值可以是任何對象,一般使用字串作為鍵.
使用字典可以大大提高我們編程的效率,下面讓我們看一個用字典表示樂曲資訊的例子.表示樂曲資訊的結構基本都是一樣的,但也有個別樂曲有所不同,例如有的樂曲的作者是多個人,有的樂曲有參考資訊等.
圖(a)中,每個框包圍的部分就是一個字典對象。一個樂曲的完整資訊由多個字典對象構成,例如,可以通過name得到曲名,通過lyrics得到作詞者,通過music得到作曲者.通過note得到備忘.當然也有可能其中某一項是空的.
在這個例子中,key和value都是字在串類型的對象,value由多個字串構成的時候可以用()把它們括起來,這種情況下字典對象的值相當―個數組對象.另外,除了字串之外,字典對象的值還支援任意對象.例如,也可以把歌曲的聲音或視頻定義為―個對象放人字典對象中.
讓我們再來看―個用字典對象表示大學教室的例子,(b)所示,和樂曲的例子一樣,每個框包圍的部分就是一個字典對象.關鍵字capacity用來表明教室可以裝多少個人mic和screen用來表明教室是否配備了麥克和投影螢幕.數實值型別的value既可以使用字串也可以使用NSNumber來描述.
在面向過程的語言中,一般使用下標或成員名來擷取數組或結構體的值。字典對象的key和value都可以是物件類型.所以可擴充性非常高,可以用在各種環境下.
字典的鍵必須是唯一的.另外,nil不能作為字典的鍵.
字典對象的值可以是除了nil外的任意對象,也可以是數組對象或字典對象。
NSDictionary
NSDictionary 字典繼承自NSObject 是一個不可變的字典,字典中儲存的元素都是以索引值對的形式存在(key-value),資料存放區是按照key1:value1 key2:value2 ...的形式進行儲存.key值必須是唯一的,value值可以重複.字典中只能存放物件類型的資料,key值和value值必須是對象,且字典中存放的索引值對是無序的.
建立
1. 建立一個空字典 init 便利構造器 dictionary
NSDictionary *dic = [[NSDictionary alloc] init];NSDictionary *dic1 = [NSDictionary dictionary];
2. 建立擁有索引值對的字典 initWithObjectsAndKeys:
便利構造器方法 dictionaryWithObjectsAndKeys:
NSDictionary *dic2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"18", @"age", @"zhangSan", @"name", @"yao", @"gender", nil];NSLog(@"%@", dic2);
列印:
2015-11-30 13:01:40.306 Myself[1711:145326] {
age = 18;
gender = yao;
name = zhangSan;
}
注意事項:
1.的時候value值在前,key值在後
2. 字典是無序的
3. 字典在建立時以nil結尾
4. key值一般都是字串對象,value值可以是任意的,但必須也是物件類型的
3. 用一個已有的字典對象初始化另一個字典 initWithDictionary:
便利構造器方法 dictionaryWithDictionary:
NSDictionary *dic3 = [[NSDictionary alloc] initWithDictionary:dic2];
4.訪問
1. 擷取字典中索引值對的數量 countNSInteger dCount = dic3.count;
2. 擷取字典中所有的key值 .allKeysNSArray *keyArray = dic3.allKeys;3. 擷取字典中所有的value值 .allValuesNSArray *valueArray = dic3.allValues;4. 根據給定的key值返回對應的value值 objectForKey:NSString *value = [dic3 objectForKey:@"age"];NSLog(@"%@", value); // 列印 18
5. 遍曆字典
forin 遍曆字典的時候,預設遍曆的就是字典的key值
for (NSString *key in dic3) { NSString *value = [dic3 objectForKey:key]; NSLog(@"%@ = %@", key, value);}
列印:
2015-11-30 13:13:57.952 Myself[1737:151680] age = 18
2015-11-30 13:13:57.952 Myself[1737:151680] name = zhangSan
2015-11-30 13:13:57.952 Myself[1737:151680] gender = yao
NSMutableDictionary
NSMutableDictionary 可變字典,繼承自 NSDictionary,管理的是可變索引值對,相對於NSDictionary增加了刪除,添加,修改的方法,隨著字典中元素的變更,NSMutableDictionary會自動管理記憶體.
建立
建立並初始化一個長度為capacity的可變字典 initWithCapacity
便利構造器方法 dictionaryWithCapacity
NSMutableDictionary *mDic = [[NSMutableDictionary alloc] initWithCapacity:0];NSMutableDictionary *mDic1 = [NSMutableDictionary dictionaryWithCapacity:0];
增加和刪除
1. 添加索引值對 setObject:<#(id)#> forKey:<#(id<NSCopying>)#>
[mDic setObject:@"wangMaZi" forKey:@"L"];[mDic setObject:@"zhangSan" forKey:@"B"];
2. 修改索引值對 setObject:<#(id)#> forKey:<#(id<NSCopying>)#>
[mDic setObject:@"xiaoPing" forKey:@"B"];NSLog(@"%@", mDic);
注意:添加和修改索引值對的方法是一樣的,如果發現字典中沒有對應的key值,此時就添加,如果發現字典中有相同key值存在,此時就覆蓋,原因就是字典中key值是唯一的
3. 根據key值刪除索引值對 removeObjectForKey:
[mDic removeObjectForKey:@"L"];
4. 刪除字典中所有的索引值對 removeAllObjects
[mDic removeAllObjects];
NSSet
Foundation架構中提供了NSSet,它是一組單值對象的集合.同NSArray不同,NSSet儲存的是無序的對象,同一個對象也只能儲存一個.
集合的特點:
1. 集合中的元素都是唯一的
2. 集合中的元素都是無序的
3. 集合中只能方物件類型的元素
1. 建立一個空集 init 便利構造器方法 set
NSSet *set = [[NSSet alloc] init];NSSet *set1 = [NSSet set];
2. 建立一個擁有元素的集合 initWithObjects:
便利構造器方法 setWithObjects:
NSSet *set2 = [[NSSet alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
3. 用一個數組初始化集合對象 arrayWithObjects:
若array中存在重複元素時,可以把數組中重複的元素剔除掉,在集合中只會儲存一個.
NSArray *sArr = [NSArray arrayWithObjects:@"1", @"2", @"2", @"4", @"5", nil];NSSet *set3 = [NSSet setWithArray:sArr];NSLog(@"%@", set3);
2015-11-30 14:37:46.206 Myself[1784:178830] {(
1,
4,
2,
5
)}
訪問
4. 擷取集合中元素的個數 countNSInteger *sCount = set2.count;5. 擷取集合中隨機元素 anyObjectNSString *sValue = set2.anyObject;6. 擷取集合中所有的元素 allObjectsNSArray *sArray = set2.allObjects;
判斷
7. 判斷集合中是否包含某個對象 containsObject:
BOOL isCountain = [set2 containsObject:@"1"];NSLog(@"%@", isCountain ? @"包含" : @"不包含");//包含
8. 判斷是不是子集 isSubsetOfSet:
NSSet *set4 = [NSSet setWithObjects:@"1", @"2", @"3", nil];NSSet *set5 = [NSSet setWithObjects:@"1", @"2", nil];BOOL isSub = [set5 isSubsetOfSet:set4];NSLog(@"%@", isSub ? @"是子集" : @"不是子集");// 是子集
9. 判斷兩個集合是否有交集 intersectsSet:
BOOL isInter = [set4 intersectsSet: set5];NSLog(@"%@", isInter ? @"有交集" : @"沒有交集");//有交集
10. 判斷兩個集合是否相同 isEqualToSet:
BOOL isSame = [set4 isEqualToSet:set5];NSLog(@"%@", isSame ? @"相同" : @"不相同");
NSMutableSet
NSMutableSet 可變的集合,繼承自 NSSet
1. 建立 setWithCapacity:
NSMutableSet *mSet = [NSMutableSet setWithCapacity:0];[mSet addObject:@"1"];[mSet addObject:@"123"];[mSet addObject:@"456"];NSLog(@"%@", mSet);
2. 刪除可變集合中的元素 removeObject:
[mSet removeObject:@"1"];NSLog(@"%@", mSet);
3. 刪除可變集合中所有的元素 removeAllObjects
[mSet removeAllObjects];NSLog(@"%@", mSet);
總結:
1.有序的角度: 數組有序, 字典和集合都是無序的
2.能否通過下標來訪問: 數組可以, 字典和集合都不可以
3.元素是否可以重複: 數組可以重複, 字典中key值不可以重複,value值可以重複, 集合中元素不可以重複
4.列印的樣式: 數組: () 字典: {} 集合: {()}
注意:數組和字典經常結合起來使用;