集合对象

作者:追风剑情 发布于:2019-3-2 11:59 分类:Objective-C

NSSet、NSMutableSet、NSIndexSet、NSCountedSet、NSOrderedSet、NSMutableOrderedSet类。

NSSet是不可变集合。NSSet上拥有的操作包括:比较两个集合、计算两个集合的交集和并集等。

NSMutableSet是可变集合,是NSSet的子类。NSMutableSet上拥有的操作包括:搜索添加删除、比较两个集合、计算两个集合的交集和并集等。

NSCountedSet用来维护对象计数。

NSIndexSet用来存储一组有序的索引,没有可变版本。

NSOrderedSet和NSMutableOrderedSet是用来处理有序、不重复集合(类似于数组)的。

常用的NSSet方法
方法 描述
+(instancetype) setWithObjects: obj1, obj2,...,nil 使用一列对象创建新集合
-(id) anyObject 返回集合中任一对象
-(instancetype) initWithObjects: obj1,obj2,...,nil 使用一列对象初始新分配的集合
-(NSUInteger) count 返回集合的成员个数
-(BOOL) containsObject: obj 确定集合是否包含obj
-(BOOL) member: obj 使用isEqual:方法确定集合是否包含obj
-(NSEnumerator *) objectEnumerator 为集合中的所有对象返回一个NSEnumerator对象
-(BOOL) isSubsetOfSet: nsset 确定接收者的每个成员是否都出现在nsset中
-(BOOL) intersectsSet: nsset 确定接收者中是否至少有一个成员出现在对象nsset中
-(BOOL) isEqualToSet: nsset 确定两个集合是否相等

常用的NSMutableSet方法
方法 描述
-(void) addObject: obj 将对象obj添加到集合中
-(void) removeObject: obj 从集合中删除对象obj
-(void) removeAllObjects 删除接受者的所有成员
-(void) unionSet: nsset 将对象nsset的所有成员添加到接收者
-(void) minusSet: nsset 从接收者中删除nsset的所有成员
-(void) intersectSet: nsset 将接收者中所有不属于nsset的元素删除

常用的NSIndexSet方法
方法 描述
+(instancetype) indexSet 创建一个空的索引集合
-(BOOL) containIndex: idx 如果索引集合包含索引idx,则返回YES,否则返回NO
-(NSUInteger) count 返回索引集合中索引的数量
-(NSUInteger) firstIndex 返回集合中的第一个索引,如果集合为空,则返回NSNotFound
-(NSUInteger) indexLessThanIndex: idx 返回集合中小于idx的最接近的索引,如果没有小于idx的索引,则返回NSNotFound,类似indexLessThanOrEqualToIndex:、indexGreaterThanIndex和indexGreaterThanOrEqualIndex:
-(NSUInteger) lastIndex 返回集合的最后一个索引,如果集合为空,则返回NSNotFound
-(NSIndexSet *) indexesPassingTest: (BOOL) (^)(NSUInteger idx, BOOL *stop) block 区块应用在集合中的每一个元素。idx添加到了NSIndexSet中返回YES,否则返回NO;设置指针变量stop为YES,表示中断处理

示例

  1. #import <Foundation/Foundation.h>
  2. #import "Printing.h"
  3.  
  4. int main(int argc, const char * argv[]) {
  5. @autoreleasepool {
  6. NSMutableSet *set1 = [NSMutableSet setWithObjects:
  7. @1, @3, @5, @10, nil];
  8. NSSet *set2 = [NSSet setWithObjects:
  9. @-5, @100, @3, @5, nil];
  10. NSSet *set3 = [NSSet setWithObjects:
  11. @12, @200, @3, nil];
  12. NSLog(@"set1: ");
  13. [set1 print];
  14. NSLog(@"set2: ");
  15. [set2 print];
  16. // 相等性测试
  17. if ([set1 isEqualToSet: set2] == YES)
  18. NSLog(@"set1 equals set2");
  19. else
  20. NSLog(@"set1 is not equal to set2");
  21. // 成员测试
  22. if ([set1 containsObject: @10] == YES)
  23. NSLog(@"set1 contains 10");
  24. else
  25. NSLog(@"set1 does not contain 10");
  26. if ([set2 containsObject: @10] == YES)
  27. NSLog(@"set2 contains 10");
  28. else
  29. NSLog(@"set2 does not contain 10");
  30. // 在可变集合set1中添加和移除对象
  31. [set1 addObject: @4];
  32. [set1 removeObject: @10];
  33. NSLog(@"set1 after adding 4 and removing 10: ");
  34. [set1 print];
  35. // 获得两个集合的交集
  36. [set1 intersectSet: set2];
  37. NSLog(@"set1 intersect set2: ");
  38. [set1 print];
  39. // 两个集合的并集
  40. [set1 unionSet: set3];
  41. NSLog(@"set1 union set3: ");
  42. [set1 print];
  43. // NSCountedSet用来记录集合中相同对象个数
  44. NSCountedSet *countSet = [[NSCountedSet alloc] init];
  45. NSLog(@"set1 count: %li", (long)[countSet countForObject: set1]);
  46. [countSet addObject: set1];
  47. [countSet addObject: set1];
  48. [countSet addObject: set1];
  49. NSLog(@"set1 count: %li", (long)[countSet countForObject: set1]);
  50. [countSet removeObject: set1];
  51. NSLog(@"set1 count: %li", (long)[countSet countForObject: set1]);
  52. }
  53. return 0;
  54. }

运行测试
111.png

示例二:NSIndexSet
AddressBook.h、AddressBook.m 参见 示例:制作地址薄
添加一个查询方法

  1. -(NSIndexSet *) lookupAll: (NSString *) theName
  2. {
  3. NSIndexSet *result = [book indexesOfObjectsPassingTest:
  4. ^(id obj, NSUInteger idx, BOOL *stop)
  5. {
  6. if ([[obj name] caseInsensitiveCompare: theName] == NSOrderedSame)
  7. return YES;
  8. else
  9. return NO;
  10. }];
  11. return result;
  12. }



标签: Objective-C

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号