NSMutableArray добавить объект с порядком - PullRequest
51 голосов
/ 18 ноября 2011

У меня есть NSMUtableArray, в котором есть элементы, например:

a,b,c,e

И я хочу добавить объект d позади c и перед e. Другими словами, я хотел бы вставить объект в отсортированный массив. (Объект также может быть пользовательским объектом)

Я хотел бы знать: кроме использования for для поиска позиции, есть ли другой способ для ее реализации? Лучше использовать iOS API.

Спасибо.

Ответы [ 3 ]

112 голосов
/ 18 ноября 2011

Вы можете использовать -[NSArray indexOfObject:inSortedRange:options:usingComparator:], чтобы запросить NSArray для индекса, в который должен быть вставлен объект, с учетом диапазона массива, который в данный момент отсортирован.

Например, предполагая, что весь массивsorted ::

NSMutableArray *array = …;
id newObject = …;
NSComparator comparator = …;

NSUInteger newIndex = [array indexOfObject:newObject
                             inSortedRange:(NSRange){0, [array count]}
                                   options:NSBinarySearchingInsertionIndex
                           usingComparator:comparator];

[array insertObject:newObject atIndex:newIndex];

Поскольку этот метод использует бинарный поиск, он более эффективен, чем итерация по всем элементам массива.

Компаратор - это блочный объект, который получает два объекта типаid и возвращает значение NSComparisonResult.

3 голосов
/ 18 ноября 2011

Я бы просто добавил новый объект с обоих концов и снова отсортировал массив. Если массив, к которому вы добавляете, уже отсортирован, повторная сортировка, которая перемещает один объект, будет такой же быстрой, как и все, что вы реализуете сами.

NSMutableArray *things; // populated 
id newObject;
...
[things addObject:newObject atIndex:0];
[things sortUsingSelector:@selector(compare:)];
3 голосов
/ 18 ноября 2011

Чтобы ввести элемент в известный индекс (положение), используйте

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

. Чтобы найти положение объекта, ранее помещенного в NSMutableArray, используйте

- (int)indexOfObject:(id)anObject

NSMutableArray - получить целое число индекса массивов путем поиска по строке

Раздел Поиск объектов в массиве
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...