2011-01-01 8 views
3

私は以下のように辞書をセットアップしました。実際のキー値(俳優の名前)をobjectAtIndex:1から取得するにはどうすればよいですか?辞書オブジェクトからキーを取得しますか?

<plist version="1.0"> 
<dict> 
    <key>Brad Pitt</key> 
    <array> 
     <string>Fight Club</string> 
     <string>Seven</string> 
     <string>Inglorious Basterds</string> 
     <string>Babel</string> 
    </array> 
    <key>Meryl Streep</key> 
    <array> 
     <string>Adaptation</string> 
     <string>The Devil Wears Prada</string> 
     <string>Doubt</string> 
     <string>Julie &amp; Julia</string> 
    </array> 
    <key>Chris Cooper</key> 
    <array> 
     <string>Adaptation</string> 
     <string>American Beauty</string> 
     <string>The Bourne Identity</string> 
     <string>October Sky</string> 
    </array> 
</dict> 
</plist> 

答えて

1

私はあなたがこのような何かを探していると思う:あなたはこのような構造を使用して、たとえば、あなたがNSArrayの中でそれらを格納する必要が順序付けられたリストに俳優/映画のペアを保存したい場合は?

NSString *actorName = [[actorsDictionary allKeys] objectAtIndex:index]; 
+0

美しい。それはまさに私が探していたものです。どうもありがとう! – thenameisnick

+6

これは間違っています。 'allKeys'は**未定義**の順番で(辞書自体が順序付けされていないので)物事を返します。内部実装の詳細は一見一貫した注文を返すかもしれませんが、これは過去に変更されたり変更されたりする可能性があります*。この振る舞いに依存することは間違っているでしょう。 –

+0

Daveは絶対に正しいです。この回答は正しくありません。 –

5

ブルートフォースそれは:

NSArray * allKeys = [dictionary allKeys]; 
NSString * randomKey = [allKeys objectAtIndex:(arc4random() % [allKeys count])]; 
+0

私は事前に映画や俳優の名前を知りません。私が持っているのはランダムオブジェクトのインデックス番号だけです。 – thenameisnick

+0

NSDictionaryは、あなたのために間違ったデータ構造です。なぜなら、定義上は順序付けられていないからです。順序マップが必要です.AFAIK、Foundation、およびAppKitには1つも含まれていません。 – ipmcc

+0

それ以上に、ランダムキーを返す方法はありますか? – thenameisnick

1

辞書が発注されていないので、そこにある:あなたが辞書からランダムなキーを返すようにしたい場合は

- (NSString *)actorForFilm:(NSString *)film { 
    NSDictionary * dictionary = ...; //your dictionary as read from the plist 
    for (NSString * actorName in dictionary) { 
     NSArray * films = [dictionary objectForKey:actorName]; 
     if ([films containsObject:film]) { 
      return actorName; 
     } 
    } 
    return nil; 
} 

、あなたが行うことができますNSDictionaryクラスのno objectAtIndex:メソッド。

# pseudo-code: [] = array, {} = dictionary 
[ 
    { actor: "Brad Pitt", movies: ["Fight Club", "Seven", "Babel"] }, 
    { actor: "Meryl Streep", movies: ["Adaptation", "Doubt"] }, 
    # etc... 
] 
+0

ああ、私は辞書が順序付けられていないことを知らなかったので、それは意味をなさないでしょう。しかし、他の理由から、私はそのようにデータを構造化することは避けています。辞書のキー値を最初に配列にロードし、インデックス値に基づいてアクターの名前を取得することは可能ですか? – thenameisnick

+0

インデックスキーを使用すると機能します。しかし、あなたはまだ間違ったデータ構造を使用しています。あなたが何をしているかによって、その技術部を避けたいかもしれません。誤ったデータ構造を使用すると、コードベースを劣化させる「クイックフィックス」を簡単に構築できます。 –

関連する問題