Objective-C學習篇08—NSDictionary與NSSet,nssetnsdictionary

來源:互聯網
上載者:User

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.列印的樣式: 數組: () 字典: {} 集合:  {()}

 

     注意:數組和字典經常結合起來使用;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.