[解決済み】NSMutableArrayから反復処理中に削除する最良の方法は?
2022-04-15 04:48:06
質問
Cocoaで、NSMutableArrayをループして、ある基準に適合する複数のオブジェクトを削除したい場合、オブジェクトを削除するたびにループを再起動せずにこれを行う最善の方法は何でしょうか。
ありがとうございます。
例えば、私がいるインデックスを手動で更新するよりも、もっとエレガントな方法を探していました。例えば、C++で私は行うことができます。
iterator it = someList.begin();
while (it != someList.end())
{
if (shouldRemove(it))
it = someList.erase(it);
}
解決方法は?
わかりやすくするために、削除するアイテムを集める最初のループを作りたいと思います。 そして、それらを削除する。 以下は、Objective-C 2.0の構文を使ったサンプルです。
NSMutableArray *discardedItems = [NSMutableArray array];
for (SomeObjectClass *item in originalArrayOfItems) {
if ([item shouldBeDiscarded])
[discardedItems addObject:item];
}
[originalArrayOfItems removeObjectsInArray:discardedItems];
そうすれば、インデックスが正しく更新されているかどうかなど、細かな帳簿上の疑問はなくなります。
追記編集しました。
他の回答で、逆形式の方が高速であることが指摘されています。つまり、配列を繰り返し処理し、破棄するオブジェクトの代わりに、保持するオブジェクトの新しい配列を構成する場合です。 しかし、NSArray は通常の配列のようには動作しないので、たとえ速くなったとしても、素朴な実装ではそれほど大きな問題にはならないかもしれません。 NSArray は通常の配列のように動作しないからです。 良い分析はこちらをご覧ください。
逆計算の方が速いかもしれませんが、私の場合は上記の計算で十分速いので、逆計算を気にする必要はありません。
私にとって重要なメッセージは、自分にとって最も分かりやすい方式を使うことです。 必要な場合のみ最適化する。 私自身は、上記の方式が一番わかりやすいと思うので、それを使っています。 しかし、もし逆計算の方がわかりやすいのであれば、そちらを使ってください。
関連
-
[解決済み】開発者の身元が確認できないため開けない
-
[解決済み] どのような場合に@synthesizeを明示的に使用する必要がありますか?
-
[解決済み] イニシャライザーの要素がコンパイル時定数でない
-
[解決済み] クラス 'test_coredataAppDelegate' の重複したインターフェイス宣言
-
[解決済み] NSStringにパーセント記号を追加する方法
-
[解決済み] 「NSString *' 型のパラメータに 'const NSString *' を送ると修飾子が破棄される」警告
-
[解決済み】Objective-Cのコードをユニットテストするのに最適な方法は何ですか?
-
[解決済み】Objective-C: パス文字列からファイル名を抽出する
-
[解決済み] NSMutableArrayをシャッフルする最も良い方法は何ですか?
-
[解決済み] Objective-Cの名前空間の衝突を解決する最善の方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Xcodeのビルド失敗 "アーキテクチャx86_64の未定義シンボル"
-
[解決済み] アーキテクチャ i386 のシンボルが見つかりませんでした。
-
[解決済み] arc4randomとarc4random_uniformの違いは何ですか?重複
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] プロジェクト内の単一ファイルのARCを無効にするにはどうしたらいいですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] Objective-Cで、オブジェクトの種類をテストするにはどうしたらいいですか?
-
[解決済み] ブロック内の変数をブロック外の変数に代入する
-
[解決済み] 「NSString *' 型のパラメータに 'const NSString *' を送ると修飾子が破棄される」警告
-
[解決済み] Objective-CでNSArrayを逆引きするにはどうしたらいいですか?