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

filteredArrayUsingPredicate:次のような単純なブロックでNSArrayのメソッドを使用することをお勧めします。

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

ブロック内のロジックは単純であり、ゼロ以外のfloatはすべて真であり、したがって述語を渡します。

于 2012-06-22T23:11:38.253 に答える
2

NSNumbersを使用している場合は、より洗練されたオプションがあります。

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

これremoveObject:は、特定のオブジェクトの配列内のすべてのオカレンスを削除するためです。オブジェクトの比較はメソッドに基づいてisEqual:いるため、NSNumbersに関しては、ポインターではなく値を比較します。

于 2012-06-22T23:35:52.993 に答える
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 に答える