1

我正在尝试扫描 NSMutableArray 并删除所有 0。(它们被包裹在 NSNumber 对象中)。我试图只使用 for 循环进行搜索,但我遇到了这样一个问题,即一旦我删除了一个对象,它就会导致未来迭代的索引越界问题。我想不出一个合乎逻辑的方法来轻松解决这个问题。

我目前的代码是这样的:

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

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

4

5 回答 5

2

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

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

就是这样,因为removeObject:删除了给定对象数组中的所有出现。对象的比较是基于isEqual:方法的,所以当涉及到 NSNumbers 时,它不是比较指针而是比较值。

于 2012-06-22T23:35:52.993 回答
2

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

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

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

于 2012-06-22T23:11:38.253 回答
1

从另一端开始。

for (int i = array.count - 1; i >= 0; --i) {
    ...
于 2012-06-22T23:09:34.640 回答
1

类似于 ctrahey 的建议,但可能是一种更易读/更容易理解的方法,正在使用[NSPredicate predicateWithFormat:]

NSPredicate *nonZero = [NSPredicate predicateWithFormat:@"SELF == %@", [NSNumber numberWithFloat:0.0]];
array = [array filteredArrayUsingPredicate:nonZero];
于 2012-06-22T23:27:27.537 回答
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];
于 2012-06-22T23:19:41.207 回答