web-dev-qa-db-fra.com

NSMutableArray ajouter un objet avec une commande

J'ai un NSMUtableArray qui a des éléments, par exemple:

 a, b, c, e 

Et je veux ajouter un objet d derrière c et avant e. En d'autres termes, j'aimerais insérer un objet dans un tableau trié (l'objet peut également être un objet personnalisé)

J'aimerais savoir: outre l'utilisation de for pour trouver la position, existe-t-il une autre méthode pour l'implémenter? Il est préférable d'utiliser l'API iOS.

Merci.

52
scorpiozj

Vous pouvez utiliser -[NSArray indexOfObject:inSortedRange:options:usingComparator:] pour demander à un NSArray l'index où un objet doit être inséré en fonction d'une plage de tableaux actuellement triée.

Par exemple, en supposant que le tableau entier est trié ::

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

Comme cette méthode utilise la recherche binaire, elle est plus efficace que l'itération sur tous les éléments du tableau.

Le comparateur est un objet bloc qui reçoit deux objets de type id et renvoie une valeur NSComparisonResult.

112
user557219

Pour injecter l'élément dans un index (position) connu, utilisez

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

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

Et pour trouver la position d'un objet précédemment placé dans NSMutableArray, utilisez

- (int)indexOfObject:(id)anObject

NSMutableArray - Obtenir un entier d'index de tableaux en recherchant avec une chaîne

Section Recherche d'objets dans un tableau
http://developer.Apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

3
Marek Sebera

Je voudrais simplement ajouter le nouvel objet à chaque extrémité et trier à nouveau le tableau. Si le tableau auquel vous ajoutez est déjà trié, le nouveau tri qui déplace un objet sera à peu près aussi rapide que tout ce que vous implémenteriez vous-même.

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