Как мне создать Objective-C NSDictionary NSArrays без повторного использования того же NSArray? - PullRequest
2 голосов
/ 19 сентября 2009

Долгое время разработчик Windows, первый раз разработчик Objective-C / iPhone хочет создать NSDictionary NSArrays, который может отображаться в простом UITableView с алфавитными секциями.

Источником этого словаря массивов является массив, содержащий имена магазинов, отсортированные в алфавитном порядке:

Apple Store
Атланта Хлебная Компания
Границы
Мастерская Build-A-Bear
Галерея Каргилл
Dillards
Спортивные товары Дика
Эдди Бауре
Сундучок
GameStop
Heizberg Diamonds
LensCrafters
Макдональдс
Nordstrom
Payless Shoe Source
Керамика сарай
Solstice
Starbucks Coffee
Victoria's Secret
White Barn Candle Co.

Словарь массивов, созданный из источника, должен выглядеть примерно так (тип данных в скобках):

Root (словарь)
.... A (Массив)
........ Apple Store (String)
........ Атланта Хлебная Компания (String)
.... B (Массив)
........ Границы (Строка)
........ Мастерская Build-A-Bear (Строка)
.... C (Массив)
........ Галерея Cargill (Строка)
.... D (Массив)
........ Диллардс (Строка)
........ Спортивные товары Дика (Строка)
....так далее.

Словарь массивов, подобных приведенной выше структуре, заполняет TableView и выглядит следующим образом:

A
Apple Store
Атланта Хлебная Компания
B
Границы
Мастерская Build-A-Bear
С
Галерея Каргилл
D
Dillards
Спортивные товары Дика
и т. д.

Код, который я написал для создания словаря массивов, в конце концов помещает последнее хранилище (White Barn Candle Co.) после каждого заголовка раздела.

A
White Barn Candle Co.
B
White Barn Candle Co.
C
White Barn Candle Co.
D
White Barn Candle Co.
и т. д.

Я понимаю, что это происходит, потому что я повторно использую временный массив, заполняя его буквами А, очищая его, заполняя его буквами В, удаляя его и т. Д. Вот фактический код, который создает словарь массивов из источника массив.

NSMutableDictionary *places = [[NSMutableDictionary alloc] init];
NSMutableArray *alphaPlace = [[NSMutableArray alloc] init]; 

for (int x = 1; x <= 26; x++) {
    NSString *alphabet = [[NSString alloc] initWithString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
    NSString *letter = [alphabet substringWithRange:NSMakeRange(x - 1, 1)];

    for (NSString *place in allPlaces) {
        NSString *first = [place substringWithRange:NSMakeRange(0, 1)];
        if ([first isEqualToString:letter] == YES) { // Add to alphaPlace
            [alphaPlace addObject:place];
        }
        else { // Add alphaPlace to places, clear out alphaPlace; add new item to alphaPlace
            [places setValue:alphaPlace forKey:letter];
            [alphaPlace removeAllObjects];  // SAME ARRAY BEING USED FOR ALL LETTERS OF ALPHABET!
            [alphaPlace addObject:place];
        }
    }
}

Я понимаю, что мог бы "грубой силой" это создать 26 различных массивов и использовать оператор switch, чтобы выбрать правильный для заполнения, но я действительно не хочу этого делать. Я думал, что кто-то, более знакомый с Objective-C, может предложить мне более элегантное решение.

Заранее спасибо. Дайте мне знать, если вам нужно больше информации.

1 Ответ

11 голосов
/ 19 сентября 2009

Я думаю, вы хотите сделать что-то вроде этого:

NSMutableDictionary *places = [[NSMutableDictionary alloc] init];

// initialize places with an array for each letter
NSString *alphabet = [[NSString alloc] initWithString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
for (int x = 0; x < 26; x++) {
    NSString *letter = [alphabet substringWithRange:NSMakeRange(x, 1)];
    [places setObject:[NSMutableArray array] forKey:letter];
}

// then put each place in the array corresponding to its first letter
for (NSString *place in allPlaces) {
    NSString *first = [[place substringWithRange:NSMakeRange(0, 1)] uppercaseString];
    NSMutableArray *letterArray = [places objectForKey:first];
    [letterArray addObject:place];
}
...