iphone - 如何创建 NSArray 的 Objective-C NSDictionary 而不重复使用相同的 NSArray?

标签 iphone objective-c nsmutablearray nsmutabledictionary

长期 Windows 开发人员、第一次 Objective-C/iPhone 开发人员希望创建一个 NSArray 的 NSDictionary,可以在带有字母部分的普通 UITableView 中显示。

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

苹果商店
亚特兰大面包公司
边框
搭建小熊工作坊
嘉吉画廊
迪拉兹
迪克的体育用品
埃迪·鲍尔
FootLocker
游戏站
海茨伯格钻石
亮视点
麦当劳
诺德斯特龙
Payless鞋源
陶器谷仓
至日
星巴克咖啡
维多利亚的 secret
怀特谷仓蜡烛公司

从源创建的数组字典应如下所示(括号中的数据类型):

根(字典)
....A(数组)
........苹果商店(字符串)
........亚特兰大面包公司(串)
....B(数组)
........边框(字符串)
........搭建熊工作坊(弦乐)
....C(数组)
........嘉吉画廊(串)
....D(数组)
........迪拉兹(弦)
........迪克的体育用品(绳子)
....ETC。

类似上述结构的数组字典填充 TableView 并显示如下:

一个
苹果专卖店
亚特兰大面包公司
B
边框
搭建小熊工作坊
C
嘉吉画廊
D
迪拉兹
迪克的体育用品
等等

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

一个
怀特谷仓蜡烛公司
B
怀特谷仓蜡烛公司
C
怀特谷仓蜡烛公司
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 的人可以为我提供更优雅的解决方案。

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

最佳答案

我认为你想做这样的事情:

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];
}

关于iphone - 如何创建 NSArray 的 Objective-C NSDictionary 而不重复使用相同的 NSArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1447376/

相关文章:

ios - NSMutableArray removeAllObjects 崩溃

ios - 分析 iPad 项目的内存泄漏

iPhone:在不修改文件扩展名的情况下在Xcode中编译C++文件

iphone - 以 root 身份运行 iPhone 应用程序

objective-c - Objective C 接口(interface)生成的头文件无法导入到其他头文件中

ios - 为什么 NSDateFormatter 在 iOS 7 上返回 nil

macos - 将 NSMutableArray 绑定(bind)到单个列 NSTableView 的简单方法是什么

iphone - URL 重定向到 spy 软件站点

iphone - 使用 VM 跟踪器进行 iOS 分析。脏内存和常驻内存导致内存警告,怎么办?

ios - 删除突出显示栏按钮上的白色