NSIndexSet

NSIndexSet 用法

NSIndexSet类代表一个不可变的独特的无符号整数的集合,称为索引,因为使用它们的方式。这个集合被称为索引集。你不应该使用索引集存储任意集合的整数值,因为索引集按索引排序范围的方式存储的。这使得它们更有效率比存储单个整数的集合。这也意味着每个索引值指数中只能出现一次。通俗点讲NSIndexSet就是一个 唯一的,有序的,无符号整数的集合。
 
NSMutableIndexSet是一个可变的集合,其使用方法如:

NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];    

    [idxSet addIndex:5];

    [idxSet addIndex:2];

    [idxSet addIndex:8];

    [idxSet addIndex:12];

   //  添加 4到13的索引值

    [idxSet addIndexesInRange:NSMakeRange(4, 10)];

    [idxSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop)     

    {

        NSLog(@"%lu", (unsigned long)idx);   

    }];

打印结果: 

2013-11-29 11:34:52.328 Tabels[862:a0b] 2

2013-11-29 11:34:52.328 Tables[862:a0b] 4

2013-11-29 11:34:52.328 Tables[862:a0b] 5

2013-11-29 11:34:52.329 Tables[862:a0b] 6

2013-11-29 11:34:52.329 Tables[862:a0b] 7

2013-11-29 11:34:52.330 Tables[862:a0b] 8

2013-11-29 11:34:52.330 Tables[862:a0b] 9

2013-11-29 11:34:52.330 Tables[862:a0b] 10

2013-11-29 11:34:52.331 Tables[862:a0b] 11

2013-11-29 11:34:52.331 Tables[862:a0b] 12

 

2013-11-29 11:34:52.332 Tables[862:a0b] 13

 

NSIndexSet同时还包含许多方法判断是否包含某区间或者从一个索引值内获取临近的区间内的索引。如下代码:

 NSUInteger a = [idxSet indexGreaterThanIndex:5];

 NSUInteger b = [idxSet indexLessThanIndex:5];

 NSUInteger c = [idxSet indexGreaterThanOrEqualToIndex:5];

 NSUInteger d = [idxSet indexLessThanOrEqualToIndex:5];    

 

 NSLog(@"a = %lu, b = %lu, c = %lu, d = %lu", (unsigned long)a,(unsigned long)b,(unsigned long)c,(unsigned long)d);

结果:2013-11-29 15:42:23.053 Tables[1165:a0b] a = 6, b = 4, c = 5, d = 5

 

NSIndexSet还取一个NSRange范围中的交集,然后还可以以相反的顺序进行枚举。

这个需求需要使用NSIndexSet的enumerateIndexesInRange:options:usingBlock:方法,如下代码

[idxSet enumerateIndexesInRange:NSMakeRange(4, 4) options:NSEnumerationReverse usingBlock:^(NSUInteger idx, BOOL*stop) {

         NSLog(@"%lu", (unsigned long)idx);

 

    }]

结果是:

2013-11-29 15:49:38.413 Tables[1187:a0b] 7

2013-11-29 15:49:38.414 Tables[1187:a0b] 6

2013-11-29 15:49:38.414 Tables[1187:a0b] 5

 

2013-11-29 15:49:38.415 Tables[1187:a0b] 4

由于idxSet的本身的区间是2,4 -13,NSMakeRange(4, 4) 的区间是4 - 7,取交集就是4-7,然后反序就是7,6,5,4.

 

通过NSIndexSet获取数组

    NSMutableIndexSet *idxSet1 = [[NSMutableIndexSet alloc] init];

    [idxSet1 addIndex:1];

    [idxSet1 addIndexesInRange:NSMakeRange(3, 3)];

    [idxSet1 addIndexesInRange:NSMakeRange(7, 2)];

    NSArray *array = @[@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"];

    NSArray *result = [array objectsAtIndexes:idxSet1];

    [result enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL*stop) {

        NSLog(@"%@",obj);

 

    }];

结果是:

2013-11-29 15:59:03.961 Tables[1209:a0b] 1

2013-11-29 15:59:03.961 Tables[1209:a0b] 3

2013-11-29 15:59:03.961 Tables[1209:a0b] 4

2013-11-29 15:59:03.962 Tables[1209:a0b] 5

2013-11-29 15:59:03.962 Tables[1209:a0b] 7

 

2013-11-29 15:59:03.963 Tables[1209:a0b] 8

 

 

转载于:https://www.cnblogs.com/HHJJ/p/5210780.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值