NSMutableArray вставить объект в индекс - PullRequest
14 голосов
/ 21 июня 2011

У меня есть пустой изменяемый массив.Можно ли вставить объект, например, в индекс 2, а в индексах 0 и 1 ничего нет?Я имею в виду, чтобы увеличить емкость динамически или что-то в этом роде..Regards.

Ответы [ 3 ]

40 голосов
/ 21 июня 2011

NSMutableArray не является разреженным массивом;это не позволяет пустые слоты, которые могут быть заполнены позже.initWithCapacity: просто намекает массиву, что он будет заполнен до определенной суммы;на практике это обычно не требуется, и, если вы точно не знаете, сколько элементов вы собираетесь поместить в массив, не называйте его (просто используйте init).

Изменяемый массив будетдовольно эффективно увеличиваются в размерах при добавлении объектов.

Если вам нужна структура данных, которая поддерживает «дыры», то либо используйте что-то другое, либо поместите объект-заполнитель в слоты, которые должны быть пустыми.

Т.е., если вы хотите массив с 10 слотами, вы можете сделать:

NSMutableArray *a = [NSMutableArray array];
for(int i = 0; i<10; i++) [a addObject: [NSNull null]];

Затем вы можете проверить, найден ли полученный объект isEqual: [NSNull null], чтобы узнать, пустой слот или нет.И вы можете использовать replaceObjectAtIndex:withObject:, чтобы прикрепить объект к определенному индексу.

Или вы можете использовать другую структуру данных;например, словарь с индексами в качестве ключей.

11 голосов
/ 21 июня 2011

Для этого можно использовать NSPointerArray .

NSPointerArray - изменяемая коллекция, смоделированная после NSArray, но она также может содержать значения NULL, которые можно вставлять или извлекать (которые способствуют подсчету объекта).Кроме того, в отличие от традиционных массивов, вы можете установить счетчик массива напрямую.


NSPointerArray доступно в OS X v10.5 и более поздних версиях и iOS 6.0 и более поздних версиях.Если вы нацелены на более низкую версию ОС, вы можете, например:

  • Использовать NSMutableDictionary, заключить ваши индексы в NSNumber с и использовать их в качестве ключей.

  • Используйте NSMutableArray и заполните "дыры" NSNull объектами.

2 голосов
/ 24 июня 2011

Напишите себе класс 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...