在 Cocoa 中,如果我想遍历 NSMutableArray 并删除多个符合特定条件的对象,那么在每次删除对象时不重新启动循环的最佳方法是什么?
谢谢,
编辑:只是为了澄清-我正在寻找最好的方法,例如比手动更新我所在的索引更优雅的东西。例如在 C++ 中我可以做到;
iterator it = someList.begin();
while (it != someList.end())
{
if (shouldRemove(it))
it = someList.erase(it);
}
最佳答案
为了清楚起见,我喜欢创建一个初始循环,在其中收集要删除的项目。然后我删除它们。这是一个使用 Objective-C 2.0 语法的示例:
NSMutableArray *discardedItems = [NSMutableArray array];
for (SomeObjectClass *item in originalArrayOfItems) {
if ([item shouldBeDiscarded])
[discardedItems addObject:item];
}
[originalArrayOfItems removeObjectsInArray:discardedItems];
那么,关于索引是否被正确更新,或其他小簿记细节就毫无疑问了。
编辑添加:
在其他答案中已经指出,逆公式应该更快。即,如果您遍历数组并组成一个新的对象数组来保留,而不是要丢弃的对象。这可能是真的(尽管分配新数组并丢弃旧数组的内存和处理成本如何?)但即使它更快,它也可能不像幼稚的实现那样重要,因为 NSArrays不要表现得像“正常”数组。他们谈论谈话,但他们走的是不同的路。 See a good analysis here:
逆向公式可能更快,但我从来不需要关心它是否是,因为上面的公式总是足够快以满足我的需求。
对我来说,带回家的信息是使用您最清楚的任何表述。仅在必要时进行优化。我个人觉得上面的公式最清楚,这就是我使用它的原因。但是,如果你对逆公式更清楚,那就去吧。
https://stackoverflow.com/questions/111866/