如何在不重用相同NSArray的情况下创建NSArrays的Objective-C NSDictionary?

bil*_*aya 2 iphone objective-c nsmutablearray nsmutabledictionary

长期以来,Windows开发人员,第一次使用Objective-C/iPhone开发人员想要创建NSArrays的NSDictionary,它可以在带有字母部分的普通UITableView中显示.

这个数组字典的源代码是一个包含按字母顺序排序的商店名称的数组:

苹果商店
亚特兰大面包公司
国界
熊熊工作室
嘉吉画廊
迪拉兹
迪克体育用品
埃迪Baure
手提箱
GameStop的
Heizberg钻石
视点
麦当劳
诺德斯特龙
玮伦鞋业
Pottery Barn的
冬至
星巴克咖啡
维多利亚的秘密
白色谷仓烛业

从源创建的数组字典应该类似于这样(括号中的数据类型):

Root(Dictionary)
.... A(Array)
........ Apple Store(String)
........ Atlanta Bread Company(String)
.... B(Array)
... ..... Borders(String)
........ Build-A-Bear Workshop(String)
.... C(Array)
........ Cargill Gallery(String)
... .D(阵列)
........ Dillards(String)
........ Dick的体育用品(String)
......等.

像上面结构的数组字典填充TableView并显示如下:

一个
苹果商店
亚特兰大面包公司

国界
熊熊工作室
Ç
嘉吉画廊
d
迪拉兹
迪克体育用品
等.

我编写的创建数组字典的代码最终将每个节标题后面的最后一个商店(White Barn Candle Co.)放入.

A
White Barn Candle Co.
B
White Barn Candle Co.
C
White Barn Candle Co.
D
White Barn Candle Co.

我意识到这种情况正在发生,因为我重用了一个临时数组,用A填充它,清除它,用B填充它,清除它等等.这是从源数组创建数组字典的实际代码.

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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我意识到我可以通过创建26个不同的数组并使用switch语句选择正确的数组来"暴力破解",但我真的不想这样做.我认为更熟悉Objective-C的人可以为我提供更优雅的解决方案.

提前致谢.如果您需要更多信息,请告诉我.

dcr*_*sta 11

我想你想做这样的事情:

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];
}
Run Code Online (Sandbox Code Playgroud)