如何在Cocoa中做稀疏数组

时间:2009-08-30 21:34:02

标签: 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 resize

并调整数组大小以便我可以...

[data insertObject:obj atIndex:index];

最后一个尺寸和新尺寸之间的所有槽都为零,最终将在以后填充。

所以我的问题是如何调整现有NSMutableArray的大小?

谢谢, 罗马

4 个答案:

答案 0 :(得分:33)

使用NSPointerArray。

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSPointerArray_Class/Introduction/Introduction.html

  

NSPointerArray是一个可变集合   以NSArray为模型,但它也可以   保持NULL值,可以   插入或提取(以及   贡献对象的数量)。   而且,与传统阵列不同,   你可以设置数组的数量   直。在垃圾收集   环境,如果指定归零   弱内存配置,如果是   收集的元素被替换为   一个NULL值。

如果您要使用像解决方案这样的字典,请使用NSMapTable。它允许整数键。推荐的基于NSMutableDictionary的解决方案具有与所有拳击和放大相关的大量开销。拆箱整数键。

答案 1 :(得分:17)

听起来NSMutableDictionary可以更好地满足您的需求。您需要将int包装到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的大小并不容易,因为在中间插槽中不能有零个对象。但是,您可以使用[NSNull null]作为“填充符”来创建稀疏数组的外观。

答案 2 :(得分:1)

正如Jason的回答一样,NSMutableDictionary似乎是最好的方法。它增加了将索引值转换为NSNumber和从NSNumbers转换索引值的开销,但这是一个经典的空间/时间权衡。

在我的实现中,我还包含了一个NSIndexSet,使得遍历稀疏数组变得更加简单。

请参阅https://github.com/LavaSlider/DSSparseArray

答案 3 :(得分:-4)