删除所有其他元素

时间:2014-05-08 19:49:27

标签: objective-c

我有一个大型数组(我想要绘制图形),我希望通过删除其中的每个其他元素来减小它的大小。如果我有一个像:

这样的数组
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"Hello",  @"Again", @"World", @"I", @"Test", @"All-Day", nil];

我怎样才能把它归结为:

(Hello, World, Test)

2 个答案:

答案 0 :(得分:1)

任何涉及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

假设removeObjectsInRange:有效,这将在O(N)时间内完成工作。

更新

由于HotLicks似乎认为这个算法不起作用,所以这是一个测试:

@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
)

答案 1 :(得分:0)

使用这样的函数:

- (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;
}

您必须注意,因为如果您在NSMutableArray 上执行操作,则在添加和删除对象时索引会发生变化(因此我的第一个答案出现问题)。


输出:

2014-05-08 16:14:14.693 test[2013:303] Input array: (
    0,
    1,
    2,
    3,
    4,
    5
)
2014-05-08 16:14:14.693 test[2013:303] Returned array: (
    0,
    2,
    4
)