Foundation 之 NSSet和NSMutableSet以及NSIndexSet和NSMutableIndexSet

NSSet集合


      NSSet集合和NSArray有相似之處,都是存儲不同的對象(地址)
      NSArray是有序的, NSSet是無序的。
      另外注意:如果往一個集合中兩次添加同樣的元素,那麼集合中只有一個該元素(去重複)。
      NSSet集合本質上是一個哈希表,採用散列算法。在查找元素的時候比數組更快。

創建和初始化一個集合

      NSSet * set = [[NSSet alloc] initWithObject:@"one",@"two",@"three",@"four",nil];  

            // 和數組一樣,NSSet集合中的元素可以是任意的對象

      NSLog(@"%@", set);  // 打印整個集合
      NSLog(@"%lu", [set count]);  // 集合中元素的個數

通過數組來創建和初始化一個集合

      NSArray * array = [[NSArray alloc] initWithObject:@"one",@"two",@"three",@"four",nil];
      NSSet * set = [[NSSet alloc] initWithArray: array];

將集合中的元素取出來生成一個數組

      NSArray * array2 = [set allObjects];

判斷集合中是否擁有某個元素

      BOOL ret = [set containsObject:@"two"];
      NSLog(@"%d", ret);

判斷兩個集合是否相等

      BOOL ret = [set1 isEqualToSet:set2];

判斷集合是否是另一個集合的子集合

      BOOL ret = [set1 isSubsetOfSet:set2];

            // 只要第一個集合set1中的所有元素包含在第二個集合set2中,

                                              也就是說只要set1是set2的子集就返回YES


集合的遍歷

      枚舉器法

      NSEnumerator * enumerator = [set objectEnumerator];
      id * obj;
      while(obj = [enumerator nextObject]) {
            NSLog(@"%@", obj);
      }

      知識點:枚舉器(又叫做迭代器),可以遍歷數組NSArray,字典NSDictionary,集合NSSet。

NSMutableSet可變集合


      NSMutableSet是NSSet的子類,所以繼承父類NSSet的方法函數,另外還可以動態的添加和刪除。

創建和初始化

      NSMutableSet * mutableSet = [[NSMutableSet alloc] init];

增加元素

      [mutableSet addObject:@"one"];  // 增加元素
      [mutableSet addObject:@"two"];
      [mutableSet addObject:@"three"];
            // 注意:如果添加的元素有重複的,那麼只保留一個。

刪除元素

      [mutableSet removeObject:@"three"];

增加另一個集合(或可變集合)中的元素

      NSSet * newSet = [[NSSet alloc] initWithObjects:@"five",@"six",@"siven",nil];
      [set unionSet:newSet];  // 將newSet集合中的所有元素添加進set集合

刪除另一個集合(或可變集合)中的元素

      [set minusSet:newSet];  // 將newSet集合中的所有元素從set集合中刪除

NSIndexSet索引集合


      NSIndexSet是NSSet的變種,它們之間並沒有繼承關係。
      NSIndexSet裝的都是數字,是數字的集合。

初始化

      NSIndexSet * indexSet = [[NSIndexSet alloc] initWithIndexesInRange: NSMakeRange(2, 3)];  

            // 集合內是2,3,4三個元素

            // 給一個範圍,集合裏就是範圍內的所有數字,NSMakeRange(2, 3)從2開始的3個數字。

用法:通過索引集合獲取到數組中相應的元素組成新數組

      NSArray * array = [[NSArray alloc] initWithObjects:@"zero",@"one",@"two",@"three",@"four",@"five",nil];

      NSArray * newArray = [array objectsAtIndexes: indexSet];  

            // 通過索引集合獲取到數組中相應下標的元素組成新數組

            // 這是連續的下標,如果是可變索引集合NSMutableIndexSet還可以提取不連續的數字下標的元素。

NSMutableIndexSet可變索引集合


對比以上用法,如果是可變索引集合NSMutableIndexSet還可以提取不連續的數字

      如:

      NSMutableIndexSet * mutableIndexSet = [[NSMutableIndexSet alloc] init];

增加元素

      [mutableIndexSet addIndex:0];
      [mutableIndexSet addIndex:3];
      [mutableIndexSet addIndex:5];
      // 然後就可以用不連續的索引集合獲取數組中的不相鄰元素組成新數組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章