IOS NSIndexSet的使用小节

来源:互联网 发布:搜狗输入法下载 linux 编辑:程序博客网 时间:2024/05/22 05:25

NSIndexSet可以用来存储一系列的索引值区间,索引值可以使用单个的NSUInteger或者NSRange来表示。而且和许多其他集合类型一样,它有不可变和可变的执行,分别对应NSIndexSet类型和NSMutableIndexSet类型。NSIndexSet可以通过一个NSUinteger,NSRange或者另一个NSIndexSet来创建。也可以使用NSMutableIndexSet来多次添加NSUinteger或者NSRange对象。

 

比如创建一个NSMutableIndexSet对象,加入数据,然后枚举所有的索引值:

NSMutableIndexSet *idxSet = [[NSMutableIndexSet allocinit];

//添加52

[idxSet addIndex:5];

[idxSet addIndex:2];

//添加7-10

[idxSet addIndexesInRange:NSMakeRange(74)];

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

{

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

}];

输出:

2

5

7

8

9

10

 

NSIndexSet还支持其他方式的枚举方法,比如可以取一个NSRange范围中的交集,然后还可以以相反的顺序进行枚举。

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

NSMutableIndexSet *idxSet = [[NSMutableIndexSet allocinit];

//添加52

[idxSet addIndex:5];

[idxSet addIndex:2];

//添加7-10

[idxSet addIndexesInRange:NSMakeRange(74)];

//idxSet包含的区间:2, 5, 7 - 10

//取交集:3 – 8

[idxSet enumerateIndexesInRange:NSMakeRange(36options:NSEnumerationReverseusingBlock:^(NSUInteger idx, BOOL *stop)

{

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

}];

输出:

8

7

5

由于NSIndexSet本身的区间是:2,5,7 – 10。然后取交集的区间是3 – 8。最后倒序枚举,所以会输出8,7,5。

 

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

NSMutableIndexSet *idxSet = [[NSMutableIndexSet allocinit];

//添加52

[idxSet addIndex:5];

[idxSet addIndex:2];

//判断是否包含3 - 5

NSLog(@"%d", [idxSet containsIndexesInRange:NSMakeRange(32)]);

//4起找到最近的等于或者大于的索引值

NSLog(@"%lu", (unsigned long)[idxSet indexGreaterThanOrEqualToIndex:4]);

输出:

0

5

 

还可以使用NSIndexSet的indexesInRange:options:passingTest:方法来根据要求返回另一个NSIndexSet。操作过程和上面讲的enumerateIndexesInRange:options:usingBlock:方法类似,只不过Block参数需要返回一个BOOL,通过这个BOOL来决定元素是否被加入到返回的NSIndexSet对象中。

代码:

NSMutableIndexSet *idxSet = [[NSMutableIndexSet allocinit];

//添加52

[idxSet addIndex:5];

[idxSet addIndex:2];

//添加7-10

[idxSet addIndexesInRange:NSMakeRange(74)];

//NSRange的交集中倒着枚举

NSIndexSet *subSet = [idxSet indexesInRange:NSMakeRange(36) options:NSEnumerationReverse passingTest

^BOOL(NSUInteger idx, BOOL *stop)

{

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

     return idx % 2;

}];

//枚举subSet

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

{

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

}];

输出:

> 8

> 7

> 5

5

7

 

最后的方法就是NSArray的objectsAtIndexes,该方法可以根据一个NSIndexSet所在的区间返回数组相应的成员。

代码:

NSMutableIndexSet *idxSet = [[NSMutableIndexSet allocinit];

[idxSet addIndex:2];

[idxSet addIndexesInRange:NSMakeRange(53)];

 

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

NSArray *res = [arr objectsAtIndexes:idxSet];

 

for(id item in res) {

    NSLog(@"%@", item);

}

输出:

2

5

6

7

 出处:http://www.cnblogs.com/mgen/p/3343511.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 50天婴儿不吃奶怎么办 儿子关在房间玩电脑怎么办? 宽带拨号上网账号密码忘了怎么办 双眼皮割的太宽怎么办 营业执照异常名录移除注销怎么办 工商局注册后骚扰电话怎么办 单位工作失误医保断交7年怎么办 大门对大门怎么办?巧用天官赐福 委托书公司名称打错了怎么办 招行ubank不对账怎么办 信贷公司利息高不合理怎么办 衣服上的logo掉怎么办 ui设计师接不到私活怎么办 微信打开很慢怎么办 小泰迪感冒加身上结痂怎么办 法斗眼睛肿了怎么办 地图鱼身上有白点怎么办 人被广告牌砸了怎么办 小米手机出现繁体中文英文怎么办 雅思考试把姓名写错了怎么办 房贷的流水账假怎么办 报到证报道期限过期了怎么办 注销公司公章丢了怎么办 家里的猫太调皮怎么办 孩子纹身了我该怎么办 46天婴儿感冒了怎么办 狗病了不吃东西怎么办 幼儿急诊见风了怎么办 哺乳期乳房有硬块而且疼怎么办 哺乳期乳头破裂乳房似针扎怎么办 回奶胀痛的厉害怎么办 淡水龟的壳变软了怎么办 棕色的泰迪变白怎么办 大班教案泥石流来了怎么办 鸟类的嘴巴坏了怎么办 四川麦蚊子咬了怎么办 脸上被晒脱皮了怎么办 额头被晒脱皮了怎么办 脸黑一块白一块怎么办 小乌龟的壳软了怎么办 把田螺后面吃了怎么办