Двунаправленная карта в какао - PullRequest
10 голосов
/ 10 марта 2010

Какао предоставляет NSDictionary, который по сути является ассоциативным массивом.

Есть ли хороший способ получить двунаправленную ассоциативность? то есть один способ был бы, если бы NSDictionary имел метод keyForObject:, который отражал поведение objectForKey:.

Мне действительно все равно, если NSDictionary не способ получить это. Я знаю, что NSDictionary обеспечивает keysOfEntriesPassingTest:, но возвращает NSSet *, который выглядит не совсем чистым для того, что я хочу иметь.

Вот пример:

fieldMap = [[NSDictionary alloc] initWithObjectsAndKeys:
    @"c0",@"synckey",
    @"c1",@"wi_id",
    @"c2",@"wi_parent_id",
    @"c3",@"wi_type",
    @"c4",@"wi_rh_task",
    @"c5",@"decision_key",
    @"c6",@"wi_stat",
    @"c7",@"wi_prio",
    @"c8",@"wi_cd",
    @"c9",@"wi_ct",
    @"cb",@"wi_dh_stat",
    @"cc",@"wi_user",
    nil];

Я хочу перевести между c0 и synckey и обратно, и то же самое для других полей.

Ответы [ 2 ]

10 голосов
/ 10 марта 2010

Самое близкое к тому, что вы ищете, я считаю allKeysForObject:. Это возвращает NSArray, содержащий ключи, соответствующие всем вхождениям данного объекта в словаре. Очевидно, что если объект находится в словаре только один раз, NSArray будет содержать только один объект.

Итак, с вашим примером:

fieldMap = [[NSDictionary alloc] initWithObjectsAndKeys:
    @"c0",@"synckey",
    @"c1",@"wi_id",
    @"c2",@"wi_parent_id",
    @"c3",@"wi_type",
    @"c4",@"wi_rh_task",
    @"c5",@"decision_key",
    @"c6",@"wi_stat",
    @"c7",@"wi_prio",
    @"c8",@"wi_cd",
    @"c9",@"wi_ct",
    @"cb",@"wi_dh_stat",
    @"cc",@"wi_user",
    nil];

Этот дополнительный код вернул бы массив, содержащий 1 строковый объект, имеющий значение @ "c7":

NSArray *keyArray = [fieldMap allKeysForObject:@"wi_prio"];

[В сторону: обратите внимание, что это будет работать только из-за того, как работает компилятор; он принимает все вхождения @ "wi_prio" и делает их одним и тем же объектом. Если вместо этого вы, возможно, загрузили словарь с диска и т. Д., Этот подход не будет работать для строк NSStrings. Вместо этого вам, вероятно, следует использовать allKeys, а затем выполнить итерацию по ним, сравнивая с [mystring isEqualToString:anotherString].]

8 голосов
/ 10 марта 2010

Фреймворк CHDataStructures имеет CHBidirectionalDictionary .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...