Двунаправленная карта в какао

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

Существует ли хороший способ получить двунаправленную ассоциативность? т.е. один путь состоял бы в том, если NSDictionary имел a 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 и назад, и так же для других полей.

10
задан ArjunShankar 10 March 2010 в 11:00
поделиться

2 ответа

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

8
ответ дан 3 December 2019 в 20:41
поделиться

Самое близкое к тому, что вам нужно, - это 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] .]

10
ответ дан 3 December 2019 в 20:41
поделиться