我有一个空的可变数组。例如,是否可以在索引2处插入对象,而在索引0和1处没有任何内容?我的意思是动态增加容量或类似的东西。 .Regards。
答案 0 :(得分:40)
NSMutableArray
不是稀疏数组;它不允许以后可以填充的空槽。 initWithCapacity:
只是向数组提示它将被填充到一定数量;在实践中通常不需要它,除非你确切地知道要在数组中推送多少项,否则不要打扰它(只需使用init
)。
随着对象的添加,可变数组的大小会非常有效地增长。
如果您需要一个支持“漏洞”的数据结构,那么要么使用其他东西,要么将占位符对象放在应该为空的插槽中。
即。如果你想要一个包含10个插槽的阵列,你可以这样做:
NSMutableArray *a = [NSMutableArray array];
for(int i = 0; i<10; i++) [a addObject: [NSNull null]];
然后,您可以检查检索到的对象isEqual: [NSNull null]
是否知道插槽是否为空。并且您可以使用replaceObjectAtIndex:withObject:
将对象粘贴到特定索引处。
或者您可以使用不同的数据结构;例如,带有索引的字典作为键可以使用。
答案 1 :(得分:11)
您可以使用NSPointerArray。
NSPointerArray是一个可变集合 以NSArray为模型,但它也可以 保持NULL值,可以 插入或提取(以及 贡献对象的数量)。 而且,与传统阵列不同, 你可以设置数组的数量 直接
NSPointerArray
。如果您针对较低的操作系统版本,则可以使用,例如:
使用NSMutableDictionary
,将索引包装到NSNumber
中并将其用作关键字。
使用NSMutableArray
并使用NSNull
个对象填充“漏洞”。
答案 2 :(得分:2)
使用底层NSMutableDictionary为自己编写一个SparseArray类。像这样的东西(最小的代码,几乎没有测试,但它应该给你的想法)。
@interface SparseArray : NSObject {
@private
NSMutableDictionary* _dict;
int count;
}
-(SparseArray*)initWithCapacity:(NSUInteger)anInt;
-(id)objectAtIndex:(int)anIndex;
-(void)insertObject:(id)anObject atIndex:(int)anIndex;
- (void)removeObjectAtIndex:(int)anIndex;
-(int)count;
@implementation SparseArray
-(SparseArray*)initWithCapacity:(NSUInteger)anInt {
if ((self = [super init])) {
_dict = [[NSMutableDictionary dictionaryWithCapacity:anInt] retain];
count = 0;
}
return self;
}
-(id)objectAtIndex:(int)anIndex {
NSNumber* key = [NSNumber numberWithInt:anIndex];
id object = [_dict objectForKey:key];
return object;
}
-(void)insertObject:(id)anObject atIndex:(int)anIndex {
NSNumber* key = [NSNumber numberWithInt:anIndex];
[_dict setObject:anObject forKey:key];
count++;
}
- (void)removeObjectAtIndex:(int)anIndex {
NSNumber* key = [NSNumber numberWithInt:anIndex];
id object = [_dict objectForKey:key];
if (object) {
[_dict removeObjectForKey:key];
count--;
}
}
-(int)count {
return count;
}
-(void)dealloc {
[_dict release];
[super dealloc];
}
@end