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

时间: 2024-10-12 08:39:02

NSIndexSet的相关文章

下标索引NSIndexSet

在操作数组或者字典的时候,有时候需要数组中的元素挑选出几个,然后组成新的数组,这时候使用NSIndexSet会非常的方便. NSArray *arr = @[@"look",@"that",@"country",@"very",@"nice"]; NSIndexSet *_set = [[NSIndexSet alloc]initWithIndexesInRange:NSMakeRange(2, 3)];/

IOS阶段学习第16天笔记(Category、NSSet、NSIndexSet的操作)

IOS学习(OC语言)知识点整理 一.NSSet.NSMutableSet集合的介绍 1)NSSet.NSMutableSet集合,元素是无序的,不能有重复的值. 2)用实例方法创建一个不可变集合对象 例如: //宏定义 #define TOBJ(n) [NSNumber numberWithInt:n] NSSet *set1=[[NSSet alloc]initWithObjects:TOBJ(2),TOBJ(3),TOBJ(3),TOBJ(1),TOBJ(5), nil]; 2)用类方法创

Objective-C之集合对象(NSSet,NSMutableSet,NSIndexSet)

NSArray:有序的集合,NSSet:无序的集合,散列存储. 但是NSSet保证数据的唯一性.当插入相同的数据时,不会有任何效果.从内部实现来说是hash表.NSMutableSet是NSSet的子类,是NSSet的可变形式. NSSet.NSMutableSet NSSet的使用[NSSet setWithSet:(NSSet *)set]; 用另外一个set对象构造[NSSet setWithArray:(NSArray *)array];用数组构造[NSSet setWithObject

iOS7: 漫谈基础集合类(NSArray,NSSet,NSOrderedSet,NSDictionary,NSMapTable,NSHashTable, NSPointerArray, NSIndexSet,NSCache, NSFastEnumeration)

基础集合类是每一个Mac/iOS应用的基本组成部分.在本文中,我们将对”老类”(NSArray, NSSet)和”新类”(NSMapTable, NSHashTable, NSPointerArray)进行一个深入的研究,探索每一个的效率细节,并讨论其使用场景. 提示:本文包含一些参照结果,但它们并不意味着绝对精确,也没有进行多个.复杂的测试.这些结果的目的是给出一个快速和主要的运行时统计.所有的测试基于iPhone 5s,使用Xcode 5.1b1和iOS 7.1b1,64位的程序.编译选项设

NSIndexSet 浅析

Cocoa 中提供了两个用于维护区间集合的类型:NSIndexSet和NSMutableIndexSet . 这两个类型容易其名字一样,其区别就在于是否可以修改.这个区别和NSArray的一样,NSIndexSet必须在创建初始化时确定其中的值. 学习一个新的类型,其实其基本概念写的再绕,再难懂都不用怕,我们只需要看看其实际的运用场景,知道怎么用了再回来研究一些哲学上的问题. 下面这个例子功能是从一个数组中返回指定区间的元素,调用数组的 objectsAtIndexes方法,指定NSIndexs

新浪微博客户端(18)-集成下拉刷新控件UIRefreshControl

HomeViewController.m - (void)setupPullToRefreshView { UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(refreshNewData:) forControlEvents:UIControlEventValueChanged]; [self.tableView a

iOS 下的相册与图片处理

iOS 下的相册与图片处理 需求 很多公司项目中都会使用到相册,以及相机,保存图片,从相册中选取图片等等操作.本文将详细介绍该功能如何实现优化,以及使用一些优秀的第三方库来辅助完成我们的需求. photos framework 的使用 Photos Framework reference Classes PHAdjustmentData /* When a user edits an asset, Photos saves a PHAdjustmentData object along with

iOS开发——面试篇&OC基本语法总结(面试)

OC基本语法总结(面试) C和OC对比 OC中主要开发在什么平台上的应用程序? 答:可以使用OC开发Mac OS X平台和iOS平台的应用程序 OC中新增关键字大部分是以什么开头? 答:OC中新增关键字大部分是以@开头 OC中新增加了那些数据类型? 答: Block类型 指针类型(Class, id类型) 空类型 特殊类型(SEL, nil) 面向对象特性是什么? 答:继承性,封装性,多态性 import和#include有什么区别? 答:import 的功能和 include一样, 是将右边的

UI_10 表视图的编辑、UITableViewController

读取plist文件并将其内容显示到表视图上.并添加编辑(增加,删除).移动cell的操作. plist文件内容如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" " http://www.apple.com/DTDs/PropertyList-1.0.dtd ">