迭代NSMutableArray时,如何删除一个对象然后插入多个对象?

时间:2016-04-04 06:09:35

标签: ios objective-c algorithm nsmutablearray

例如,如果我们有一个NSMutableArray实例,其中包含10个对象。迭代它时,我们发现我们必须删除对象a [2]和[8],然后在[2]处连续插入3个对象,在[8]处连续插入4个对象,如何在最低时间执行此操作费用?

任何想法都会感激不尽!

4 个答案:

答案 0 :(得分:3)

编辑:正如@trojanfoe所指出的那样,很高兴补充说,在迭代时不应该编辑数组。许多不同语言的许多集合类都是如此;不只是NSMutableArray& Objective-C的。这样做很容易导致越界指数。

对于你的问题,让我们在两次迭代中完成。 首先,我们要保存要删除的索引,因此我们将迭代sourceArray。

NSMutableArray * indexesToRemove = [NSMutableArray array];

[sourceArray enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL * _Nonnull stop) {
    if (obj.integerValue%2 == 1) {
        // Insert at first position
        [indexesToRemove insertObject:@(idx) atIndex:0];
    }
}];

将索引保存在数组而不是集合中非常重要,因为您希望以后插入对象。此外,在数组的开头添加新项很重要,因此您将从最大索引迭代到最小索引,并且不必根据先前添加的项移动索引。

现在,您可以在新的迭代中(这次在索引数组上)删除项目并根据您保存的索引添加新项目:

[indexesToRemove enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL * _Nonnull stop) {

    NSUInteger indexToRemove = obj.unsignedIntegerValue;

    // Delete the item from the source array
    [sourceArray removeObjectAtIndex:indexToRemove];

    // Create the items you want to insert, do whatever you want in this method :]
    NSArray * itemsToAdd = [self generateElementsToAddAtIndex:indexToRemove];

    // Create the indexSet according to the start index and the number of objects you want to insert
    NSIndexSet * indexSet = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(indexToRemove, itemsToAdd.count)];

    // Insert the objects
    [sourceArray insertObjects:itemsToAdd atIndexes:indexSet];        
}];

答案 1 :(得分:0)

[myMutableArray replaceObjectAtIndex:2 withObject:"5"]; 它会起作用吗?

答案 2 :(得分:0)

首先,您必须删除对象,然后使用下面的代码行插入多个对象:

NSMutableOrderedSet *orderedSet = [[NSMutableOrderedSet alloc] init];
[orderedSet insertObjects:@[@"Eezy", @"Tutorials"] atIndexes:
                       [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)]];
NSLog(@"Result: %@", orderedSet);

请参阅以下参考链接:

http://ios.eezytutorials.com/nsmutableorderedset-by-example.php#.VwIJIhN95fg

答案 3 :(得分:0)

对于如此小的阵列和如此多的操作,我认为用新的阵列替换阵列是一个很好的选择 - 性能和清晰度。