Objective c NSMutableArray在索引处插入对象

Objective c NSMutableArray在索引处插入对象,objective-c,Objective C,我有一个空的可变数组。例如,当索引0和1没有对象时,是否可以在索引2处插入对象?我的意思是动态地增加容量或类似的东西。关于。NSMutableArray不是稀疏数组;它不允许以后填充空插槽initWithCapacity:只是提示数组将填充到一定数量;在实践中通常不需要这样做,除非您确切知道要在数组中放入多少项,否则不要麻烦调用它(只需使用init) 随着对象的添加,可变数组的大小将非常有效地增长 如果您需要一个支持“洞”的数据结构,那么可以使用其他东西,或者在应该为空的插槽中放置占位符对象 也

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

NSMutableArray
不是稀疏数组;它不允许以后填充空插槽
initWithCapacity:
只是提示数组将填充到一定数量;在实践中通常不需要这样做,除非您确切知道要在数组中放入多少项,否则不要麻烦调用它(只需使用
init

随着对象的添加,可变数组的大小将非常有效地增长

如果您需要一个支持“洞”的数据结构,那么可以使用其他东西,或者在应该为空的插槽中放置占位符对象

也就是说,如果您想要一个具有10个插槽的阵列,您可以执行以下操作:

NSMutableArray *a = [NSMutableArray array];
for(int i = 0; i<10; i++) [a addObject: [NSNull null]];
NSMutableArray*a=[NSMutableArray];
对于(inti=0;i你可以用a来表示

NSPointerArray是一个可变集合 以NSArray为模型,但也可以 保留空值,可以是 插入或提取(以及 参与对象的计数)。 此外,与传统阵列不同, 您可以设置数组的计数 直接的


NSPointerArray
在OS X v10.5及更高版本和iOS 6.0及更高版本中可用。如果您的目标是较低的OS版本,则可以,例如:

  • 使用
    NSMutableDictionary
    ,将索引包装到
    NSNumber
    s中,并将其用作键

  • 使用
    NSMutableArray
    并用
    NSNull
    对象填充“孔”


使用底层的NSMutableDictionary为自己编写一个SparseArray类。类似这样的代码(最少的代码,几乎没有经过测试,但它应该会让您有所了解)



嗯,你为什么要这么做?:)我在大学里的小项目需要它。:)是的;我应该提到这一点。NSPointerArray是一个非常有用的类!但是,NSPointerArray在iOS IIRC上不可用。NSPointerArray在iOS 6及更高版本上可用。遗憾的是,此对象不支持快速枚举。即使您确实通过采用
NSFastEnumeration
添加了它,实现也会非常低效,或者无法保证枚举是有序的(正如您从数组对象期望的那样)。您可以添加两个category方法,根据需要自动附加
NSNull
对象,并检查元素是否为null对象,然后返回nil。我就是这样做的:
@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