NSMutableArray按顺序添加对象

55

我有一个NSMUtableArray,里面有元素,例如:

a,b,c,e

我想在ce之间添加一个对象d,换句话说,我想向已排序的数组中插入一个对象(对象也可以是自定义的对象)。

请问:除了使用for循环查找位置外,还有其他方法来实现吗?最好使用iOS API。

谢谢。


Bavarious 应该是正确的答案,尽管该方法在 iOS4 中可用。对于早期版本的 iOS,可能需要手动枚举。或者添加对象并对数组进行排序,然后就可以获取索引了。 - scorpiozj
3个回答

115

你可以使用-[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值。


1
我遇到了相同的问题,而且对于比较器也感到困惑。请帮助我解决这个问题。 - Sekhar
6
如果有人不知道如何使用NSComparator -- NSComparator compareStuff = ^(id obj1, id obj2) { return NSOrderedSame; }; - S S
许多对象都有compare方法,可以使用它或编写自定义比较方法来处理自定义类。 - AlKozin

3

要将元素注入到已知的索引(位置),请使用

- (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 - Get Arrays Index Integer By Searching With A String

在数组中查找对象
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html


谢谢,但它没有找到数组中元素的索引。我想在已排序的数组中插入一个元素。 - scorpiozj

3

我会在数组的两端添加新对象并重新对数组进行排序。如果你要添加的数组已经排好序了,那么重新排序只需要移动一个对象,将会和你自己实现的任何其他方法一样快。

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

实际上,该数组是uitableview的数据源。我需要知道添加对象的索引,以便我可以插入新行。 - scorpiozj
5
当然,这将起作用,但关键问题是你计划多频繁这样做?相比于“搜索和插入”方法,“在末尾添加并重新排序”的方法在计算上很差劲。如果数据集很大或者你经常这样做,你可能要考虑@Bavarious提供的答案。 - Cubs Fan Ron
这种方法需要进行线性扫描O(n)。由于它已排序,因此二分查找(如上所建议)速度更快,为O(log(n))。 - mrgrieves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接