【问题标题】:NSMutableArray add object with orderNSMutableArray 按顺序添加对象
【发布时间】:2011-11-18 09:14:55
【问题描述】:

我有一个NSMUtableArray,其中包含元素,例如:

a,b,c,e

我想在c 后面和e 之前添加一个对象d。 换句话说,我想将一个对象插入到排序数组中。(对象也可以是自定义对象)

我想知道:除了使用for来找位置,还有其他方法可以实现吗?最好使用iOS api。

谢谢。

【问题讨论】:

  • Bavarious 应该是正确的答案,尽管该方法在 iOS4 中可用。对于早期的iOS,可能需要自己枚举。或者添加对象,对数组进行排序,就可以得到索引了。

标签: objective-c nsmutablearray sorting


【解决方案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 值。

【讨论】:

  • 我有同样的问题,我对比较器感到困惑。请帮助我
  • 如果有人不知道如何使用 NSComparator -- NSComparator compareStuff = ^(id obj1, id obj2) { return NSOrderedSame; };
  • 很多对象都有 compare: 方法,使用它或者为自定义类编写自定义比较方法
【解决方案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 - Get Arrays Index Integer By Searching With A String

在数组中查找对象
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:)];

【讨论】:

  • 谢谢!实际上数组是uitableview的数据源。我需要知道添加对象的索引,以便插入新行。
  • 这当然可以,但关键问题是您打算多久执行一次?与“搜索和插入”方法相比,“最后添加并重新排序”方法在计算上很糟糕。如果数据集很大或者你经常这样做,你可以考虑上面@Bavarious提供的答案。
  • 这种方法需要线性扫描 O(n)。由于它是排序的,二分查找(如上所述)要快得多 O(log(n))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多