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:)];