我正在尝试扫描NSMutableArray并删除所有0。 (它们包含在NSNumber对象中)。我试图只使用for循环来搜索,但我遇到的问题是,一旦我删除了一个对象,它就会导致索引越界问题,以便将来迭代。我想不出一个容易解决这个问题的合理方法。
我目前的代码是:
for(int i =0; i < [array count]; i++)
{
if(!abs([[array objectAtIndex: i] floatValue]) > 0.0)
{
[array removeObjectAtIndex: i];
}
}
有没有办法修复我的循环或使用特殊的方法/函数来消除所有0?
答案 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];