2010-12-18 14 views
2

Objective-cには、NSArrayや他のコレクションでうまく動作する 'for(a in b)構文を使用した組み込みリストiterantorがあります。リストを反復し、objective-cでリストを削除しますか?

for(int i = [array count]-1; i >=0; --i) 
{ 
    if(condition) 
    { 
     [array removeItemAtIndex : i]; 
    } 
} 

またはインデックスを蓄積する:しかし、それはあなたが余分なインデックスを調整する必要はありませんので、あなたは逆の順序で配列を反復処理することができます

for(int i = 0, i < [array count]; i ++) 
{ 
    if(condition) 
    { 
    [array removeItemAtIndex : i]; 
    i --; 
    } 
} 

答えて

14

のような醜いトリックなく、このような反復中の項目を削除することが可能です列挙しながら、indexsetに削除し、一度にすべての要素を削除するには:列挙中に配列を変更していない良いスタイルかもしれないので

NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init]; 
for(int i = 0, i < [array count]; i ++) 
{ 
    if(condition) 
    { 
    [indexes addIndex : i]; 
    } 
} 
[array removeObjectsAtIndexes:indexes]; 
[indexes release]; 

私は2番目のオプションを選択します(この特定のケースではエラーは発生しませんが)

+0

私は思いますあなたの2番目の答えはそれを行うための "公式の"最も美しい方法でしょう。あなたの最初の答えは私の意見では良いですが。どちらもおそらく同じように動作します。 – Accatyyc

+4

Ole Bergemanはコレクションを変更する際には、一般的には良いアイデアではないと言っていますので、一度に要素を削除するため、2つ目の方法は(直感的に)効率的になるかもしれません。コレクションを "高速に列挙"しても、 。 – Vladimir

+0

最初の応答のforループには、セミコロンの代わりにコンマが付きます。大したことはありませんが、コードをコピーして見ました。ありがとう。 – Hahnemann

3

いいえ、列挙している間にコレクションを変更することは、明示的に禁止されています。削除する必要があるオブジェクトを2番目のテンポラリ可変配列に追加してから、ループ外にある配列のオブジェクトを元の配列からremoveObjectsInArray:で削除することができます。

+1

... Fast Enumeration *を使用すると明示的に禁止されています*。通常の 'for()'ループを使用するときに行うのは良い考えではありませんが、許されています。 –

+0

@Dave:高速列挙だけでなく、標準的なNSEnumeratorを使用することも「安全ではありません」。だから、私はそれを見ている間、_enumerating_それは本当に禁止されている間コレクションを変更する間、それを行う間、それを行うには大丈夫です。 –

+0

フェア十分です。 :) –

2

私は、配列を逆向きに反復するのは面倒なトリックとは言いません。 for(int i = array.count-1; i> = 0; i--) if(条件) [array removeItemAtIndex:i];

1

私はそれが必要な場合は、私は私の配列をコピーして他の

NSArray *arr = firstArr; 
for(int i = [array count]-1, i >=0; --i) 
{ 
    if(condition) 
    { 
     [firstArr removeItemAtIndex : i]; 
    } 
} 

を突然変異されながら1を列挙するが、私はウラジミールの例は良い方だと思います;)(ちょうどあらゆる可能性を持っているため)

関連する問題