用单个对象替换多个数组内容?

时间:2009-04-12 06:37:20

标签: objective-c cocoa-touch cocoa nsmutablearray

我有一个NSMutableArray包含我要用NSNull个对象替换的内容。

这就是我的所作所为:

NSMutableArray* nulls = [NSMutableArray array];

for (NSInteger i = 0; i < myIndexes.count; i++)
    [nulls addObject:[NSNull null]];

[stageMap replaceObjectsAtIndexes:myIndexes withObjects:nulls];

如何更有效地完成这项工作? 有没有办法枚举NSIndexSet,所以我可以逐个替换数组内容?

解决

建议的方法速度提高了2倍(平均0.000565s vs 0.001210s):

if (myIndex.count > 0)
{
    NSInteger index = [myIndex firstIndex];

    for (NSInteger i = 0; i < myIndex.count; i++)
    {
        [stageMap replaceObjectAtIndex:index withObject:[NSNull null]];
        index = [myIndex indexGreaterThanIndex:index];
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用for循环。从第一个索引开始,使用indexGreaterThanIndex:获取下一个索引,并在达到最后一个索引后停止。

不要忘记考虑空索引集。在这种情况下,第一个和最后一个索引都是NSNotFound。最简单的方法是测试索引集的计数;如果它为零,则不要循环。

此外,Jason Coco所说的关于剖析的内容。在你的程序运行之前不要太担心效率,并且在你运行Shark(或者仪器,如果这是你的东西)之前不要去优化,并找到确切的慢速。

答案 1 :(得分:0)

我意识到这是一个非常古老的问题,但我在这里张贴以防其他人发现你可以使用这个问题:

    [indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        NSLog(@"index: %d", idx);
        [objectArray replaceObjectAtIndex:idx 
                               withObject:newObject];
    }];

这更简洁。