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