55

I have a NSMUtableArray which has elements, for example:

a,b,c,e

And I want to add an object d to behind c and before e. In other words, I'd like to insert an object to a sorted array.(The object can be a custom object, too)

I'd like to know : besides using for to find the position, is there any other method to implement it? It is better to use the iOS api.

Thanks.

1
  • Bavarious's should be the right answer although the method is available in iOS4. For the earlier iOS, it may need to enumerate it yourself. Or add the object and sort the array, and then you can get the index. Commented Nov 18, 2011 at 13:25

3 Answers 3

115

You can use -[NSArray indexOfObject:inSortedRange:options:usingComparator:] to ask an NSArray for the index where an object should be inserted given an array range that’s currently sorted.

For example, assuming the entire array is 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];

Since this method uses binary search, it is more efficient than iterating over all elements in the array.

The comparator is a block object that receives two objects of type id and returns an NSComparisonResult value.

Sign up to request clarification or add additional context in comments.

3 Comments

I am having the same problem and I am confused about the comparator.Please help me with that
If anyone don't know how to use NSComparator -- NSComparator compareStuff = ^(id obj1, id obj2) { return NSOrderedSame; };
Many object have compare: method, use it or write custom compare method for custom class
3

To inject element to known index (position) use

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

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

And to find position of object previously placed into NSMutableArray use

- (int)indexOfObject:(id)anObject

NSMutableArray - Get Arrays Index Integer By Searching With A String

Section Finding Objects in an Array
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

1 Comment

thanks, but it is not finding the index of an element in a array. I'd like to insert an element in a sorted array.
3

I'd just add the new object at either end and sort the array again. If the array you're adding to is already sorted, the re-sort that moves one object is going to be about as quick as anything you'd implement yourself.

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

3 Comments

thanks! In fact the array is data source of a uitableview. I need to know the index of the added object so that I can insert a new row.
This will work, of course, but the key question is how frequently do you plan to do this? The "add at end and re-sort" approach is lousy computationally compared to the "search and insert" approach. If the data set is large OR you do this frequently, you might consider the answer provided by @Bavarious above.
This approach requires a linear scan O(n). Since it's sorted, a binary search (as suggested above) is much faster O(log(n))

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.