Объект 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