web-dev-qa-db-ja.com

NSMutableDictionaryから特定のオブジェクトのキーを取得する方法は?

大きなNSMutableDictionaryにあるオブジェクトがあり、これがどのキーを持っているかを調べる必要があります。そのため、両方の列からその「テーブル」を検索したいと思います。キーだけでなく、オブジェクト(キーを取得するため)も使用します。それは可能ですか?

32

親クラスを見てください(NSDictionary)

- (NSArray *)allKeysForObject:(id)anObject

これは、指定されたオブジェクト値のすべてのキーのNSArrayを返します。 [〜#〜] but [〜#〜] isEqualメッセージをディクショナリの各オブジェクトに送信することでこれを行うため、大規模なデータセットの場合、これは最高のパフォーマンスではない可能性があります。

オブジェクトを直接比較せずにキーにリンクされた、オブジェクト内のいくつかの重要な値でオブジェクトを見つけることができるように、何らかのインデックス構造構造を保持する必要があるかもしれません。

69
Kevin

より具体的な方法で質問に回答するには、以下を使用して特定のオブジェクトのキーを取得します。

NSString *knownObject = @"the object";
NSArray *temp = [dict allKeysForObject:knownObject];
NSString *key = [temp objectAtIndex:0];

//"key" is now equal to the key of the object you were looking for
19
AddisDev

NSDictionaryのブロックメソッドでそれは間違いなく可能です

- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate;

何らかの条件(述語)を満たすオブジェクトを返す必要があります。

次のように使用します。

    NSSet *keys = [myDictionary keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) {

       BOOL found = (objectForWhichIWantTheKey == obj);
       if (found) *stop = YES;
       return found;

    }];

詳細については、この回答を確認してください

NSDictionaryのkeysOfEntriesPassingTestで必要なブロックオブジェクト/述語を指定するにはどうすればよいですか?

6
valdyr

を見てみましょう:

- (NSArray *)allKeysForObject:(id)anObject
6
Tom Irving