33

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

4

4 に答える 4

70

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

- (NSArray *)allKeysForObject:(id)anObject

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

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

于 2010-05-07T10:20:30.733 に答える
19

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

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
于 2012-05-01T20:23:46.277 に答える
6

を見てみましょう:

- (NSArray *)allKeysForObject:(id)anObject
于 2010-05-07T10:19:35.853 に答える
6

それは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に必要なブロックオブジェクト/述語を指定するにはどうすればよいですか?

于 2012-09-26T14:14:52.050 に答える