对于基于唯一整数键的数据集,我的大小不确定。
我想使用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
的大小?
谢谢, 罗马
答案 0 :(得分:33)
使用NSPointerArray。
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,使得遍历稀疏数组变得更加简单。
答案 3 :(得分:-4)