我有一个大型数组(我想要绘制图形),我希望通过删除其中的每个其他元素来减小它的大小。如果我有一个像:
这样的数组NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"Hello", @"Again", @"World", @"I", @"Test", @"All-Day", nil];
我怎样才能把它归结为:
(Hello, World, Test)
答案 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
)