NSMutableArray在索引处插入对象

时间:2011-06-21 18:20:48

标签: objective-c

我有一个空的可变数组。例如,是否可以在索引2处插入对象,而在索引0和1处没有任何内容?我的意思是动态增加容量或类似的东西。 .Regards。

3 个答案:

答案 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值,可以   插入或提取(以及   贡献对象的数量)。   而且,与传统阵列不同,   你可以设置数组的数量   直接


OS X v10.5及更高版本以及iOS 6.0及更高版本中提供了

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