从NSNumbers的NSMutableArray中删除0

时间:2012-06-22 23:04:08

标签: objective-c nsmutablearray nsnumber

我正在尝试扫描NSMutableArray并删除所有0。 (它们包含在NSNumber对象中)。我试图只使用for循环来搜索,但我遇到的问题是,一旦我删除了一个对象,它就会导致索引越界问题,以便将来迭代。我想不出一个容易解决这个问题的合理方法。

我目前的代码是:

    for(int i =0; i < [array count]; i++)
{
    if(!abs([[array objectAtIndex: i] floatValue]) > 0.0)
    {
              [array removeObjectAtIndex: i];
    }
}

有没有办法修复我的循环或使用特殊的方法/函数来消除所有0?

5 个答案:

答案 0 :(得分:2)

我建议使用NSArray的filteredArrayUsingPredicate:方法和一个简单的块,如下所示:

NSPredicate *notZero = [NSPredicate predicateWithBlock:
    ^BOOL(id evalObject,NSDictionary * options) {
        return [evalObject boolValue];
    }];
array = [array filteredArrayUsingPredicate:notZero];

块中的逻辑很简单,任何非零的浮点都是真实的,因此传递谓词。

答案 1 :(得分:2)

当您使用NSNumbers时,有一个更优雅的选项:

[array removeObject:[NSNumber numberWithFloat:0.0f]];

就像那样,因为removeObject:删除了给定对象数组中的所有匹配项。对象的比较基于isEqual:方法,所以当谈到NSNumbers时,它不是比较指针而是比较值。

答案 2 :(得分:1)

从另一端开始。

for (int i = array.count - 1; i >= 0; --i) {
    ...

答案 3 :(得分:1)

类似于ctrahey所建议的,但也许是一种更具可读性/可理解性的方法,正在使用[NSPredicate predicateWithFormat:]

NSPredicate *nonZero = [NSPredicate predicateWithFormat:@"SELF == %@", [NSNumber numberWithFloat:0.0]];
array = [array filteredArrayUsingPredicate:nonZero];

答案 4 :(得分:0)

不要删除正在迭代的数组中的项目。而是将它们添加到另一个数组。然后将它们删除。

NSMutableArray *array = [NSMutableArray arrayWithCapacity:myArray.count];

for (int i = 0; i < myArray.count ; i++){
    NSNumber *num = [myArray objectAtIndex:i];
    if (num.doubleValue == 0) [array addObject:num];
}

[myArray removeObjectsInArray:array];