辞書を反復する方法はありますか?


200

を取得するためにNSDictionaries必要な場所として知っています。しかし、どのように私はすべての反復処理できるとして、私はそこにあるかのキーを知って、そしてどのような値がありますか?そのことを、私はと呼ばれるものがある知っているため、ループ内では。似たようなものはありますか?keyvaluekeysvaluesNSDictionaryJavaScriptObjective-C


この投稿をありがとう。Swift構文で繰り返す場合は、この投稿を参照してください:stackoverflow.com/a/24111700/419348
AechoLiu

回答:


323

はい、NSDictionary高速列挙をサポートしています。Objective-C 2.0では、次のことが可能です。

// To print out all key-value pairs in the NSDictionary myDict
for(id key in myDict)
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);

別の方法(あなたは、Mac OS Xをターゲットにしている場合に使用する必要があり、10.5を事前に、あなたはまだ10.5とiPhone上で使用することができます)を使用することですNSEnumerator

NSEnumerator *enumerator = [myDict keyEnumerator];
id key;
// extra parens to suppress warning about using = instead of ==
while((key = [enumerator nextObject]))
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);

2
ObjCの最新の構文:NSLog(@ "key =%@ value =%@"、key、myDict [key]);
geowar 2013

@Dartheniusは、最近の最適化により、少なくとも特定のケースでは、高速列挙がブロックベースよりも高速になりました。ただし、解決している問題で並行オプションを使用できる場合は、ブロックベースのアプローチの方が高速な場合があります。
Zev Eisenberg 2014年

@ZevEisenberg投稿の最後をご覧ください。
RokStrniša2014年

おっと、上のリンクをクリックして新しいタブで開きましたが、だれがそれを書いたか、この同じページにあることさえわかりませんでした。上記のコメントをまだ編集できる場合は、必要に応じて編集してください。そうすることで、怠惰な読者が間違った考えをつかむことがなくなります。
Zev Eisenberg 2014年

153

ブロックアプローチでは、すべてのキーに対してルックアップアルゴリズムを実行する必要がありません。

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
  NSLog(@"%@ => %@", key, value);
}];

たとえNSDictionaryとして実装されているハッシュテーブル(要素を検索するコストであることを意味するO(1))、ルックアップはまだして反復を遅く一定の係数

私の測定結果dは、数字の辞書について...

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
  NSNumber* value = @(i);
  dict[value.stringValue] = value;
}

...ブロックアプローチで数値を合計...

__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
  sum += value.intValue;
}];

...ループアプローチではなく...

int sum = 0;
for (NSString* key in dict)
  sum += [dict[key] intValue];

... 約40%高速です。

編集:新しいSDK(6.1以降)はループの反復を最適化するように見えるため少なくとも上記の単純なケースでは、ループアプローチはブロックアプローチよりも約20%高速です


iOS 10/11ではどちらが速いですか?
Supertecnoboff 2017

エレガント、大好きです!
YvesLeBorg 2017

10

これは、ブロックアプローチを使用した反復です。

    NSDictionary *dict = @{@"key1":@1, @"key2":@2, @"key3":@3};

    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@->%@",key,obj);
        // Set stop to YES when you wanted to break the iteration.
    }];

オートコンプリートを使用すると、設定が非常に高速になり、反復エンベロープの作成について心配する必要はありません。


ありがとうございます。NSMutableDictionaryプロセスを変更する必要がある場合の良い解決策
jose920405
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.