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,表示中断处理 |
示例
#import <Foundation/Foundation.h>
#import "Printing.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableSet *set1 = [NSMutableSet setWithObjects:
@1, @3, @5, @10, nil];
NSSet *set2 = [NSSet setWithObjects:
@-5, @100, @3, @5, nil];
NSSet *set3 = [NSSet setWithObjects:
@12, @200, @3, nil];
NSLog(@"set1: ");
[set1 print];
NSLog(@"set2: ");
[set2 print];
// 相等性测试
if ([set1 isEqualToSet: set2] == YES)
NSLog(@"set1 equals set2");
else
NSLog(@"set1 is not equal to set2");
// 成员测试
if ([set1 containsObject: @10] == YES)
NSLog(@"set1 contains 10");
else
NSLog(@"set1 does not contain 10");
if ([set2 containsObject: @10] == YES)
NSLog(@"set2 contains 10");
else
NSLog(@"set2 does not contain 10");
// 在可变集合set1中添加和移除对象
[set1 addObject: @4];
[set1 removeObject: @10];
NSLog(@"set1 after adding 4 and removing 10: ");
[set1 print];
// 获得两个集合的交集
[set1 intersectSet: set2];
NSLog(@"set1 intersect set2: ");
[set1 print];
// 两个集合的并集
[set1 unionSet: set3];
NSLog(@"set1 union set3: ");
[set1 print];
// NSCountedSet用来记录集合中相同对象个数
NSCountedSet *countSet = [[NSCountedSet alloc] init];
NSLog(@"set1 count: %li", (long)[countSet countForObject: set1]);
[countSet addObject: set1];
[countSet addObject: set1];
[countSet addObject: set1];
NSLog(@"set1 count: %li", (long)[countSet countForObject: set1]);
[countSet removeObject: set1];
NSLog(@"set1 count: %li", (long)[countSet countForObject: set1]);
}
return 0;
}
示例二:NSIndexSet
AddressBook.h、AddressBook.m 参见 示例:制作地址薄
添加一个查询方法
-(NSIndexSet *) lookupAll: (NSString *) theName
{
NSIndexSet *result = [book indexesOfObjectsPassingTest:
^(id obj, NSUInteger idx, BOOL *stop)
{
if ([[obj name] caseInsensitiveCompare: theName] == NSOrderedSame)
return YES;
else
return NO;
}];
return result;
}