1 NSIndexSet是什么?
NSIndexSet 是个无符号整数集合。集合中的元素不可变的、不可重复。常被用来当作索引使用。就从它字面上理解,就叫做:索引集合。它看上去有点像 支持离散整数的 NSRange .它能用于快速查找特定范围的值的索引,也能用于快速计算交集, 同时,Foundation collection class 提供了很多好用的方法,方便你使用 NSIndexSet.
2.NSIndexSet的一些常用方法。
类方法:
创建一个空的索引集合。
(id)indexSet
创建一个索引集合,根据索引值
(id)indexSetWithIndex:(NSUInteger)index
创建一个索引集合,根据一个NSRange对象
(id)indexSetWithIndexesInRange:(NSRange)indexRange
实例方法:
判断索引集合中是否包含制定的索引值
(BOOL)containsIndex:(NSUInteger)index
判断索引集合是否包含指定的indexSet
(BOOL)containsIndexes:(NSIndexSet *)indexSet
判断索引集合是否包含指定的indexRange
(BOOL)containsIndexesInRange:(NSRange)indexRange
返回索引集合包含的索引数量
(NSUInteger)count
返回indexRange中包含的索引数量
(NSUInteger)countOfIndexesInRange:(NSRange)indexRange
枚举NSIndexSet;执行Block操作,在指定的Rang范围内,并使用指定的options方法。
(void)enumerateIndexesInRange:(NSRange)range options:(NSEnumerationOptions)opts usingBlock:(void (^)(NSUInteger idx, BOOL *stop))block
如果,要枚举的NSIndexSet中不存在Rang中所指定的范围,则跳过。 区块应用在集合中的每个元素。idx添加到了NSIndexSet中返回YES,否则返回NO。设置指针变量stop为YES,表示中断处理。
options参数:
enum {
NSEnumerationConcurrent = (1UL << 0),
NSEnumerationReverse = (1UL << 1),
};
typedef NSUInteger NSEnumerationOptions;
NSEnumerationConcurrent
枚举过程中,各个Block是同时开始执行的。这样枚举的完成顺序是不确定的。
NSEnumerationReverse
以反序方式枚举。
@property (readonly) NSUInteger firstIndex; 返回集合中的第一个索引,如何集合为空,则返回NSNotFound
@property (readonly) NSUInteger lastIndex; 返回集合中的最后一个索引,如何集合为空,则返回NSNotFound.
-(NSUInteger) indexLessThanIndex:idx 返回集合中小于idx的最接近的索引,如果没有小于idx的索引,则返回NSNotFound.类似indexLessOrEuqalToIndex:、indexGreaterThanIndex和indexGreaterThanOrEqualIndex:.
下面是基本的使用:
//1:NSMutableIndexSet是一个可变的集合
NSMutableIndexSet *mutableIndexSet = [NSMutableIndexSet indexSet];
for (int i=5;i<=10; i++) {
[mutableIndexSet addIndex:i];
}
[mutableIndexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%u",idx);
/*
2015-12-14 11:14:52.267 NSIndexSet[748:133210] 5
2015-12-14 11:14:52.268 NSIndexSet[748:133210] 6
2015-12-14 11:14:52.268 NSIndexSet[748:133210] 7
2015-12-14 11:14:52.268 NSIndexSet[748:133210] 8
2015-12-14 11:14:52.268 NSIndexSet[748:133210] 9
2015-12-14 11:14:52.268 NSIndexSet[748:133210] 10
*/
}];
//2:NSIndexSet同时还包含许多方法判断是否包含某区间或者从一个索引值内获取临近的区间内的索引。如下代码:
NSUInteger indexGreater = [mutableIndexSet indexGreaterThanIndex:9];
NSUInteger indexLess =[mutableIndexSet indexLessThanIndex:9];
NSUInteger indexGreaterThanOrEqual = [mutableIndexSet indexGreaterThanOrEqualToIndex:9];
NSUInteger indexLessThanOrEqual = [mutableIndexSet indexLessThanOrEqualToIndex:9];
BOOL containsIndexSeven = [mutableIndexSet containsIndex:7];
NSLog(@"%u %u %u %u 是否包含%hhd",indexGreater,indexLess,indexGreaterThanOrEqual,indexLessThanOrEqual,containsIndexSeven);// 10 8 9 9 是否包含1
//3:NSIndexSet还取一个NSRange范围中的交集,然后还可以以相反的顺序进行枚举。
[mutableIndexSet enumerateIndexesInRange:NSMakeRange(5, 3) options:NSEnumerationReverse usingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%u",idx);
/*
2015-12-14 11:14:52.268 NSIndexSet[748:133210] 7
2015-12-14 11:14:52.268 NSIndexSet[748:133210] 6
2015-12-14 11:14:52.268 NSIndexSet[748:133210] 5
mutableIndexSet本身是[5,10],所以遍历范围从5开始取3个长度,然后反序进行获取数据.这里要注意一点:是索引值.如果你把范围设置为NSMakeRange(0, 3),是得不到数据的.
*/
}];
//4:通过NSIndexSet获取数组
NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
[idxSet addIndex:1]; //1
[idxSet addIndexesInRange:NSMakeRange(3, 4)];//3,4,5,6
[idxSet addIndexesInRange:NSMakeRange(8, 2)];//8,9
NSArray *array = @[@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"];
NSArray *result = [array objectsAtIndexes:idxSet];
[result enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@",obj);
/*
2015-12-14 11:22:21.353 NSIndexSet[830:172595] 1
2015-12-14 11:22:21.353 NSIndexSet[830:172595] 3
2015-12-14 11:22:21.353 NSIndexSet[830:172595] 4
2015-12-14 11:22:21.353 NSIndexSet[830:172595] 5
2015-12-14 11:22:21.353 NSIndexSet[830:172595] 6
2015-12-14 11:22:21.353 NSIndexSet[830:172595] 8
2015-12-14 11:22:21.353 NSIndexSet[830:172595] 9
*/
}];
http://nshipster.cn/nsindexset/
http://ios.eezytutorials.com/nsindexset-by-example.php