NSArrayで文字列を見つける方法は?
質問
これはこのような愚かな質問のように感じますが、 NSArray
で文字列を見つけるにはどうすればよいですか?
使用してみました
[array indexOfObjectIdenticalTo:myString]
しかし、それはスティングが同じアドレスを持っている必要があります。
これを行う方法に関するヒントはありますか?
解決
indexOfObject:
メソッド。このメソッドは、配列内の各オブジェクトに isEqual:
メッセージを送信してオブジェクトを検索します。
他のヒント
ピーターの答えは正しい。
追加の注意事項。配列に大量の文字列がある場合、 -indexOfObject:
は線形検索を実行します。これは、別のコンテナの使用を検討すべきパフォーマンスのボトルネックであることが判明する場合があります。 NSSetまたはNSDictionary、おそらく(文字列の意味に応じて)。
別の落とし穴は、文字列がすべて比較的類似している場合や比較的長い場合です。
もちろん、分析ツールを使用してパフォーマンスの問題があることを証明するまで、最適化を行わないでください。
NSOrderSetをコンテナとして使用できます。NSOrderedSetクラスリファレンスの概要は以下のとおりです。
NSOrderedSetとそのサブクラスNSMutableOrderedSetは、オブジェクトの順序付けられたコレクションへのプログラムインターフェイスを宣言します。
NSOrderedSetは、個別のオブジェクトの静的セットのプログラムインターフェイスを宣言します。静的セットのエントリは、作成時に設定します。その後、エントリを変更することはできません。一方、NSMutableOrderedSetは、個別のオブジェクトの>動的セットのプログラムインターフェイスを宣言します。動的な—または可変の—セットにより、いつでもエントリを追加および削除でき、必要に応じてメモリが自動的に割り当てられます。
要素の順序が重要であり、オブジェクトがセットに含まれているかどうかをテストする際のパフォーマンスが考慮される場合、配列の代わりに順序付きセットを使用できます— >アレイのメンバーシップのテストは、セットのメンバーシップのテストよりも遅くなります。
containsObject:
特定のオブジェクトが配列に存在するかどうかを示すブール値を返します。
- (BOOL)containsObject:(id)anObject パラメーター anObject オブジェクト。
戻り値 anObjectが配列に存在する場合はYES、そうでない場合はNO。
ディスカッション
このメソッドは、isEqual:メッセージを配列の各オブジェクトに送信することにより、anObjectが配列内に存在するかどうかを判断します(そして各isEqual:メッセージへのパラメーターとしてanObjectを渡します)。
宣言先
NSArray.h