Objective c 移除所有其他元素

Objective c 移除所有其他元素,objective-c,Objective C,我有一个大数组(我想用图形表示),我想通过删除数组中的所有其他元素来减小数组的大小。如果我有如下数组: NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"Hello", @"Again", @"World", @"I", @"Test", @"All-Day", nil]; 我如何才能将其归结为: (Hello, World, Test) 使用如下函数: - (NSMutableArray *)removeE

我有一个大数组(我想用图形表示),我想通过删除数组中的所有其他元素来减小数组的大小。如果我有如下数组:

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"Hello",  @"Again", @"World", @"I", @"Test", @"All-Day", nil];
我如何才能将其归结为:

(Hello, World, Test)

使用如下函数:

- (NSMutableArray *)removeEveryOtherElement:(NSMutableArray *)array
{
    NSLog(@"Input array: %@", array);
    NSMutableArray *returnArray = [[NSMutableArray alloc] init];
    for (int x = 0; x<=array.count - 1; x++) {
        if (x % 2 == 0) { // if the index of the object is "even" (divisible by 2)
            [returnArray addObject:[array objectAtIndex:x]];
        }
    }
    NSLog(@"Returned array: %@", returnArray);
    return returnArray;
}

任何涉及
removeObjectAtIndex:
的解决方案都是O(N^2),这可能是您不想要的,因为您说过“有一个大数组”

@interface NSMutableArray (FG8_removeOddElements)

- (void)removeOddElements;

@end

@implementation NSMutableArray (FG8_removeOddElements)

- (void)removeOddElements {
    // Given (a, b, c), result is (a, c), so round up.
    NSUInteger finalCount = (self.count + 1) / 2;
    // Element 0 never moves so start at 1.
    for (NSUInteger i = 1; i < finalCount; ++i) {
        self[i] = self[i * 2];
    }
    [self removeObjectsInRange:NSMakeRange(finalCount, self.count - finalCount)];
}

@end
以下是输出:

2014-05-08 15:23:44.123 tester[43347:303] (
    a,
    c,
    e,
    g
)

从数组中删除条目时,通常最好从后向前,这样就不会混淆索引。使用
removeObjectAtIndex
的解决方案不是N^2。事实上,它肯定比
removeObjectsInRange
更有效。我根本看不出您的解决方案是如何工作的。@HotLicks
removeObjectAtIndex:
必须向下移动数组的其余元素。这就是O(N)。执行N/2次(删除一半元素)使整个算法为O(N^2)。您可能认为可以从数组的高端开始,但即使如此,最终还是会删除索引1处的对象,并且必须向下移动数组中的所有剩余元素(这是开始时的一半,但仍然是O(N))。@HotLicks
removeObjectsInRange:
为O(N),但只执行一次。我的循环也是O(N)。O(N)+O(N)=O(N)。我正在删除最初位于奇数索引的所有元素。试试看。我用一个演示更新了我的答案。你可以在
for
循环中
x+=2
,而不是在每次迭代中测试
x%2==0
。(我不是向下的投票人。)您还可以向后遍历数组-这通常可以解决在迭代时删除对象的问题:)
@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSMutableArray *array = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"].mutableCopy;
    [array removeOddElements];
    NSLog(@"%@", array);
}

@end
2014-05-08 15:23:44.123 tester[43347:303] (
    a,
    c,
    e,
    g
)