NSMutableArray Dodaj obiekt z zamówieniem

Mam NSMUtableArray, który ma elementy, na przykład:

a,b,c,e

I chcę dodać obiekt d za c i przed e. Innymi słowy, chciałbym wstawić obiekt do posortowanej tablicy.(Obiekt może być również obiektem niestandardowym)

Chciałbym wiedzieć: czy poza użyciem for do znalezienia pozycji, jest jakaś inna metoda jej wdrożenia? Lepiej jest użyć api iOS.

Dzięki.
Author: leppie, 2011-11-18

3 answers

Możesz użyć -[NSArray indexOfObject:inSortedRange:options:usingComparator:] aby poprosić NSArray o indeks, w którym powinien być wstawiony obiekt, biorąc pod uwagę zakres tablicy, który jest aktualnie posortowany.

Na przykład, zakładając, że cała tablica jest posortowana::

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

Ponieważ ta metoda wykorzystuje wyszukiwanie binarne, jest bardziej wydajna niż iteracja wszystkich elementów w tablicy.

Komparator jest obiektem blokowym, który odbiera dwa obiekty typu id i zwraca wartość NSComparisonResult.

 111
Author: Mr Rogers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-26 16:25:04

Aby wprowadzić element do znanego indeksu (pozycji) Użyj

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

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

I aby znaleźć pozycję obiektu wcześniej umieszczonego w nsmutablearray użyj

- (int)indexOfObject:(id)anObject

NSMutableArray-Get Arrays Index Integer By Searching With A String

Sekcja znajdowanie obiektów w Array
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

 3
Author: Marek Sebera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:31:59

Dodałbym nowy obiekt na obu końcach i posortowałbym tablicę ponownie. Jeśli tablica, do której dodajesz jest już posortowana, ponowne sortowanie, które przenosi jeden obiekt, będzie tak szybkie, jak wszystko, co zaimplementujesz samodzielnie.

NSMutableArray *things; // populated 
id newObject;
...
[things addObject:newObject atIndex:0];
[things sortUsingSelector:@selector(compare:)];
 3
Author: NSResponder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-18 10:49:27