2009-07-16 19 views
17

私はObjective Cに2つの配列を持っています。同じ場所に挿入できるように、何かのインデックスがあるかどうかを調べる必要があります。たとえば、「名前配列」と「年齢配列」があるとします。どのようにインデックス "charlie"が "name array"にあるのかを知るために、 "age"配列に年齢を挿入する場所を知っていますか?Objective Cで配列インデックスを調べる方法は?

おかげ

答えて

38

-[NSArray indexOfObject:]は、論理的な選択であるように思われます。

+0

はい、私はNSMutableArrayクラスリファレンスでそれを見つけることができなかったので、チャックします。 – Xcoder

+4

うん、NSMutableArrayドキュメントには、配列を変更することと関係のあるメソッドしか含まれていません。スーパークラスのドキュメントをチェックすることは常に価値があります。 – Chuck

+1

ドキュメントによって、継承されたメソッド、ivars、およびプロパティをチェックするのを忘れやすくなります。 Andy LeeのAppKiDoアプリのコピーを手に入れてください。あなたが見逃す可能性があることが分かりやすくなります。いくつかのクラスは、それらを新しい視点で見たときに理解しやすくなります。 – uchuugaka

4

文字列に基づいてルックアップを行っている場合は、NSDictionaryも使用したいと思うかもしれません。

+0

それは大きなポイントです。人々はしばしば、ある文字列の配列の検索が線形時間を要し、辞書内の文字列を検索するのに一定の時間がかかるという事実を見落としている。 Chuckは配列のためにそれを行う方法について正しいですが、疎な記述に基づいて、辞書は大きな潜在的な解決策のようです。 –

+2

それでも、定数が大きい場合や線が短い場合は、線形時間が一定時間よりも速くなる可能性があります。基本的には、実際にパフォーマンスの問題であることを確認して確認するまで心配しないでください。 –

6

ココアでは、並列配列は運命と廃墟への道です。 Bindingsでそれらを効果的に使うことはできないので、Bindingsが存在しないかのように多くのグルーコードを書く必要があります。さらに、将来実装する前にAppleScript/Scripting Bridgeをサポートしていても、サポートを中止することになります。

nameageプロパティを持つモデルクラスを作成し、そのクラスのインスタンスの単一の配列を持つ正しい方法です。次に、名前または年齢で項目を検索するには、配列をフィルタリングするのにNSPredicateを使用し、メイン配列にフィルタリングされた配列から各項目のインデックスを見つけるにはindexOfObjectIdenticalTo:を使用します。

indexOfObject:indexOfObjectIdenticalTo:の違いは、前者が後者は唯一あなたが渡された特定のオブジェクトを探します一方、各オブジェクトは、それが探しているものであるかどうかを判断するためにisEqual:メッセージを送信することである。したがって、あなたがindexOfObject:を使用することができます配列内の等しいオブジェクトを見つけるためには、配列内にはないが1に等しいオブジェクトを使用します。

関連する問題