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

时间:2009-09-19 00:54:57

标签: iphone objective-c nsmutablearray nsmutabledictionary

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

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

Apple Store
亚特兰大面包公司
边框
Build-A-Bear Workshop
嘉吉画廊
迪拉兹
迪克的体育用品
Eddie Baure
提箱
GameStop的
海兹堡钻石
LensCrafters亮
麦当劳
诺思通
Payless Shoe Source
陶器谷仓
冬至
星巴克咖啡
维多利亚的秘密
白谷仓蜡烛公司

从源创建的数组字典应该看起来像这样(括号中的数据类型):

Root(词典)
.... A(数组)
........ Apple Store(String)
........亚特兰大面包公司(String)
.... B(阵列)
........ Borders(String)
........ Build-A-Bear Workshop(String)
.... C(数组)
........嘉吉画廊(弦乐器)
.... D(数组)
........ Dillards(String)
........迪克的体育用品(弦)
....等等。

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

一个
Apple Store
亚特兰大面包公司

边框
Build-A-Bear Workshop
ç
嘉吉画廊
d
迪拉兹
迪克的体育用品
等。

我编写的创建数组字典的代码最终将最后一个商店(White Barn Candle Co.)放在每个部分标题之后。

一个
白谷仓蜡烛公司 乙
白谷仓蜡烛公司 ç
白谷仓蜡烛公司 d
白谷仓蜡烛公司 等。

我意识到这种情况正在发生,因为我重用了一个临时数组,用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];
        }
    }
}

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

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

1 个答案:

答案 0 :(得分: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];
}