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 范围中的交集,然后还可以以相反的顺序进行枚举。

这个需求需要使用NSIndexSetenumerateIndexesInRange: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**
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,219评论 6 13
  • 卷首语 欢迎来到 objc.io 第七期! 这个月,我们选择了 Foundation 框架作为我们的主题。 Fou...
    评评分分阅读 1,568评论 0 8
  • 你在远方聆听我,我的声音却无法达到你。——题记 夏日的夜总是带着魅惑,凉爽的晚风撩起衣角,风情万种得开始展示它的吸...
    虾子面魔阅读 395评论 1 1
  • 亲爱的孩子,今天你给妈妈上了一课。我带你去超市购买春游物品,回来路上前锋小街吃饭,你要买自己最喜欢的铁板鹌鹑蛋,为...
    Grit888阅读 229评论 6 4