如何在Cocoa中做稀疏数组

8 cocoa objective-c nsmutablearray nsarray

对于基于唯一整数键的数据集,我有一个未确定的大小.

我想使用NSMutableArray快速查找,因为我的所有键都是基于整数的.

我想做这个.

NSMutableArray* data = [NSMutableArray array]; // just create with 0 size
Run Code Online (Sandbox Code Playgroud)

然后人们会开始用整数索引向我扔数据(都是唯一的)所以我只想做这样的事......

if ([data count] < index)
    [data resize:index];  // ? how do you resize
Run Code Online (Sandbox Code Playgroud)

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

[data insertObject:obj atIndex:index];
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,罗马

bbu*_*bum 32

使用NSPointerArray.

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

NSPointerArray是一个在NSArray之后建模的可变集合,但它也可以保存NULL值,这些值可以插入或提取(并且有助于对象的计数).而且,与传统数组不同,您可以直接设置数组的计数.在垃圾收集环境中,如果指定归零弱内存配置,则如果收集了一个元素,则将其替换为NULL值.

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

  • 请注意,NSPointerArray在iOS中不可用. (6认同)
  • `NSPointerArray`是6.0以来的iOS版本 (4认同)
  • 那是不对的.您未能调用-setCount:将容量设置为足够大小. (3认同)
  • `NSPointerArray` 不是一个稀疏数组,它的行为也不像一个。您仍然需要用“NULL”指针填充所有未使用的索引。`[pointerArray insertPointer:@"test" atIndex:17];` 在新实例化的 `NSPointerArray` 上的输出:`*** 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'*** -[NSConcretePointerArray insertPointer: atIndex:]: 尝试在索引 17 处插入指针超出边界 0'` (2认同)

Jas*_*son 18

听起来你的需求会更好地满足NSMutableDictionary.您需要将ints 包装到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]];
}
Run Code Online (Sandbox Code Playgroud)

放大a的大小并不容易NSMutableArray,因为你不能在中间插槽中有零个对象.但是,您可以使用[NSNull null]"填充"来创建稀疏数组的外观.

  • NSPointerArray直接支持带有孔的对象数组.如果需要散列解决方案,NSMapTable可以支持整数键(通过基于函数的API). (4认同)
  • Nitpick-哈希表查找时间是`O(1)`__iff__每个键哈希到唯一值 - 也就是说,没有哈希冲突.如果两个键散列到相同的值,那么实现需要处理这个 - 一个常见的方法是只使用链表.好的哈希表实现为您处理这些细节,比如通过动态增加哈希槽的数量,因为更多的项目被添加到表中,从而在统计上不太可能发生冲突.可以肯定地说,一个好的实现,例如`NSMutableDictionary`,提供了"几乎`O(1)`"的查找时间. (3认同)
  • @bbum在这个稀疏数组的问题中,NSPointerArray不支持其中带有孔的对象数组。来自`index`参数的`insertPointer:atIndex:`文档-该值必须小于接收者的计数。NSPointerArray`实际上与@Jason的NSMutableArray` / [[NSNull null]]解决方案相同,至少出于OP的目的-您只需用NULL而不是[NSNull null]填充漏洞。的。 (2认同)
  • NSPointerArray肯定支持漏洞.这是写课程的全部要点之一.你必须先设置计数.内部实现是稀疏数组还是散列或等等,是一个实现细节. (2认同)