Объект NSMutableArray в индексе
У меня есть пустой изменяемый массив. Можно ли, например, вставить объект по индексу 2, а там ничего нет в индексе 0 и 1? Я хочу увеличить динамику или что-то в этом роде..Regards.
Ответы
Ответ 1
NSMutableArray
не является разреженным массивом; он не позволяет пустым слотам, которые могут быть заполнены позже. initWithCapacity:
просто намекает на массив, что он будет заполнен до определенной суммы; обычно это не требуется на практике, и, если вы точно не знаете, сколько элементов вы собираетесь зацикливать в массиве, не беспокойтесь называть его (просто используйте init
).
Измененный массив будет довольно эффективно расти в размере по мере добавления объектов.
Если вам нужна структура данных, которая поддерживает "дыры", то либо используйте что-то еще, либо помещайте объект-заполнитель в слоты, которые должны быть пустыми.
т.е. если вам нужен массив с 10 слотами, вы можете сделать:
NSMutableArray *a = [NSMutableArray array];
for(int i = 0; i<10; i++) [a addObject: [NSNull null]];
Затем вы можете проверить, был ли восстановленный объект isEqual: [NSNull null]
знать, является ли слот пустым или нет. И вы можете использовать replaceObjectAtIndex:withObject:
для привязки объекта к определенному индексу.
Или вы можете использовать другую структуру данных; например, словарь с индексами, поскольку ключи будут работать, например.
Ответ 2
Вы можете использовать NSPointerArray для этого.
NSPointerArray - это изменяемая коллекция смоделированный после NSArray, но он также может удерживайте значения NULL, которые могут быть вставлен или извлечен (и который способствуют подсчету объектов). Кроме того, в отличие от традиционных массивов, вы можете установить счетчик массива непосредственно.
NSPointerArray
доступен в OS X версии 10.5 и более поздних версиях и iOS 6.0 и более поздних. Если вы нацелились на более низкую версию ОС, вы можете, например:
-
Используйте NSMutableDictionary
, оберните индексы в NSNumber
и используйте их как ключи.
-
Используйте NSMutableArray
и заполните "дыры" объектами NSNull
.
Ответ 3
Напишите себе класс SparseArray, используя базовый NSMutableDictionary. Что-то вроде этого (минимальный код, едва протестированный, но он должен дать вам идею).
@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