Foundation 之 NSSet和NSMutableSet以及NSIndexSet和NSMutableIndexSet

来源:互联网 发布:商务通软件 编辑:程序博客网 时间:2024/06/05 05:56

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];
      // 然后就可以用不连续的索引集合获取数组中的不相邻元素组成新数组

0 0
原创粉丝点击