NSIndexSet

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值