Objective c 如何在Cocoa中实现稀疏数组
我有一个基于唯一整数键的数据集的未确定大小 我想使用Objective c 如何在Cocoa中实现稀疏数组,objective-c,cocoa,nsmutablearray,nsarray,Objective C,Cocoa,Nsmutablearray,Nsarray,我有一个基于唯一整数键的数据集的未确定大小 我想使用NSMutableArray快速查找,因为我所有的键都是基于整数的 我想这样做 NSMutableArray* data = [NSMutableArray array]; // just create with 0 size 之后人们会开始用整数索引(都是唯一的)向我抛出数据,所以我只想做这样的事情 if ([data count] < index) [data resize:index]; // ? how do you
NSMutableArray
快速查找,因为我所有的键都是基于整数的
我想这样做
NSMutableArray* data = [NSMutableArray array]; // just create with 0 size
之后人们会开始用整数索引(都是唯一的)向我抛出数据,所以我只想做这样的事情
if ([data count] < index)
[data resize:index]; // ? how do you resize
最后一个大小和新大小之间的所有插槽都为零,最终将在以后填充
所以我的问题是如何调整现有的NSMutableArray
谢谢,
Roman听起来,使用
NSMutableDictionary
可以更好地满足您的需求。您需要将int
s包装到NSNumber
对象中,如下所示:
-(void)addItem:(int)key value:(id)obj
{
[data setObject:obj forKey:[NSNumber numberWithInt:key]];
}
-(id)getItem:(int)key
{
return [data objectForKey:[NSNumber numberWithInt:key]];
}
要扩大NSMutableArray
的大小并不容易,因为在中间的插槽中不能有nil对象。但是,您可以使用[NSNull null]
作为“填充”来创建稀疏数组的外观。使用NSPointerArray
NSPointerArray是一个可变集合
以NSArray为模型,但也可以
保留空值,可以是
插入或提取(以及
参与对象的计数)。
此外,与传统阵列不同,
您可以设置数组的计数
直接的。在一个垃圾收集站
环境,如果指定了调零
弱内存配置,如果
元素被收集,并替换为
空值
如果要使用类似字典的解决方案,请使用NSMapTable。它允许整数键。推荐的基于NSMutableDictionary的解决方案与整型键的所有装箱和拆箱相关,具有巨大的开销。我不同意bbum在这方面的回答。
NSPointerArray
是一个数组,而不是稀疏数组,两者之间有重要区别
我强烈建议不要使用bbums溶液
NSPointerArray
的文档可用
Cocoa已经有一个由NSArray
类定义的数组对象NSPointerArray
继承自NSObject
,因此它不是NSArray
的直接子类。但是,NSPointerArray
文档对类的定义如下:
NSPointerArray是一个以NSArray为模型的可变集合,但它也可以保存空值
我将做一个公理化的假设,文档中的这个定义断言这是NSArray
的一个“逻辑”子类
定义-
“常规”数组是:项的集合,每个项都有一个与之关联的唯一索引号
没有限定条件的数组是:一个“常规”数组,其中项的索引具有以下属性:数组中项的索引从0开始,然后依次增加。数组中的所有项包含的索引号都小于数组中的项数。将项目添加到数组中必须位于数组中最后一个项目的索引+1处,或者可以将项目插入两个现有项目索引号之间,这会导致所有后续项目的索引号增加1。现有索引编号处的项目可以替换为其他项目,并且此操作不会更改现有操作的索引编号。因此,插入和替换是两种截然不同的操作
稀疏数组是:一个“常规”数组,其中第一个项的索引号可以从任何数字开始,并且添加到数组中的后续项的索引号与数组中的其他项没有关系或限制。将项插入稀疏数组不会影响数组中其他项的索引数。在大多数实现中,插入项和替换项通常是同义的。稀疏数组中项目数的计数与稀疏数组中项目的索引号没有关系
这些定义对可测试的“黑盒”数组的行为做出了某些预测。为简单起见,我们将重点关注以下关系:
在数组中,数组中所有项的索引数小于数组中项数的计数。虽然稀疏数组可能是这样,但这不是一个要求
在对bbum的评论中,我声明如下:
NSPointerArray
不是稀疏数组,其行为也不像稀疏数组。您仍然必须使用NULL
指针填充所有未使用的索引。[pointerArray insertPointer:@“test”atIndex:17]的输出新实例化的NSPointerArray上的代码>:
***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'***-[nsConcretePointInterarray insertPointer:atIndex::]:尝试在索引17处插入超出边界0'的指针。
未经证明,上述NSPointerArray
的行为违反了稀疏数组的定义。错误消息的这一部分揭示了这一点:尝试在索引17处插入指针,超出0'
,特别是关于必须在索引0
处添加第一个新项的部分
bbum然后评论:
这是不正确的。您未能调用-setCount:将容量设置为足够大
“设置稀疏数组中项目数的计数”是无意义的。如果nspointerray
是一个稀疏数组,则在索引17处添加第一项后,nspointerray
中的项数将为1。但是,根据bbums的建议,添加第一个项目后,NSPointerArray
中的项目数为18
,而不是1
QED—它表明,NSPointerArray
实际上是一个数组
-(void)addItem:(int)key value:(id)obj
{
[data setObject:obj forKey:[NSNumber numberWithInt:key]];
}
-(id)getItem:(int)key
{
return [data objectForKey:[NSNumber numberWithInt:key]];
}