NSMutableArray добавить объект с заказом

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

a,b,c,e

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

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

Спасибо.

Ответ 1

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

Например, если весь массив отсортирован::

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.

Ответ 2

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

- (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

Ответ 3

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

NSMutableArray *things; // populated 
id newObject;
...
[things addObject:newObject atIndex:0];
[things sortUsingSelector:@selector(compare:)];