Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从NSNumbers的NSMutableArray中删除0_Objective C_Nsmutablearray_Nsnumber - Fatal编程技术网

Objective c 从NSNumbers的NSMutableArray中删除0

Objective c 从NSNumbers的NSMutableArray中删除0,objective-c,nsmutablearray,nsnumber,Objective C,Nsmutablearray,Nsnumber,我正在尝试扫描NSMutableArray并删除所有0。它们被包装在NSNumber对象中。我试图只使用for循环进行搜索,但我遇到了一个问题,即一旦删除一个对象,它将导致未来迭代的索引越界问题。我想不出一个合乎逻辑的方法来轻松解决这个问题 我目前的代码是: for(int i =0; i < [array count]; i++) { if(!abs([[array objectAtIndex: i] floatValue]) > 0.0) {

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

我目前的代码是:

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

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

从另一端开始

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

从另一端开始

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

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

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

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

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

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

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

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

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];

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

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];

与ctrahey的建议类似,但可能是一种更具可读性/易懂的方法,即使用[NSPredicate predicateWithFormat:]:


与ctrahey的建议类似,但可能是一种更具可读性/易懂的方法,即使用[NSPredicate predicateWithFormat:]:


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

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

原因很简单,因为removeObject:删除给定对象数组中的所有引用。对象的比较基于isEqual:method,因此当涉及到NSNumbers时,它不是比较指针而是比较值。

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

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


原因很简单,因为removeObject:删除给定对象数组中的所有引用。对象的比较是基于isEqual:method的,所以当涉及到NSNumber时,它不是比较指针而是比较值。

这样做的问题是,如果删除索引X处的对象,索引X+1处的对象将转到索引X。是的,这就是我发现的困难之处,但我如何纠正这个问题?我考虑过在IF中做一个I-in。但是i<[array count]仍然超出数组边界,因为我们删除了对象。这样做的问题是,如果删除索引X处的对象,索引X+1处的对象将转到索引X。是的,这就是我发现的困难之处,但我该如何纠正这个问题?我考虑过在IF中做一个I-in。但是i<[array count]仍然超出了数组边界,因为我们删除了对象。您能解释一下这是如何工作的吗?我不明白那整句话。它说明了什么!=0?将float转换为BOOL可以为您处理此问题,它内置于语言中。任何非零的浮点值都将布尔值转换为YES或true,1。剩下的只是将该部分包装到一个块中,并将该块包装为谓词,NSArray可以使用该谓词进行过滤。所以0是否定的,其他的都是肯定的。我明白了:这会比以前使用循环更快吗?因为另一个答案也很好,并且对我的代码进行了较少的更改,所以现在我想知道你为什么喜欢这种方式?请参阅我的评论,了解我为什么喜欢这种方式。我确实认为循环方法会更快,它只是更危险并且打破了编程的经验法则。我还处于学习阶段,所以我将采用安全+规则的方法。谢谢你你能解释一下这是怎么回事吗?我不明白那整句话。它说明了什么!=0?将float转换为BOOL可以为您处理此问题,它内置于语言中。任何非零的浮点值都将布尔值转换为YES或true,1。剩下的只是将该部分包装到一个块中,并将该块包装为谓词,NSArray可以使用该谓词进行过滤。所以0是否定的,其他的都是肯定的。我明白了:这会比以前使用循环更快吗?因为另一个答案也很好,并且对我的代码进行了较少的更改,所以现在我想知道你为什么喜欢这种方式?请参阅我的评论,了解我为什么喜欢这种方式。我确实认为循环方法会更快,它只是更危险并且打破了编程的经验法则。我还处于学习阶段,所以我将采用安全+规则的方法。谢谢你这是如此简单和完美的工作。真不敢相信我竟然没有想到这一点。谢谢这仍然会导致在迭代数组时对其进行变异,这是一条我通常不愿意打破的经验法则。然而,使用这种技术,您在每次迭代时都不会调用数组计数,这是很好的。它非常简单,工作非常完美。真不敢相信我竟然没有想到这一点。谢谢这 仍然会导致在迭代时对数组进行变异,这是我通常不愿意打破的经验法则。然而,使用这种技术,您在每次迭代时都不会调用数组上的count,这是很好的。