如何创建NSArrays的一个Objective-C的NSDictionary不重复使用相同的NSArray?
-
11-09-2019 - |
题
长时间窗口显影剂,第一时间目标C / iPhone开发者想要创建可以显示在与字母部分纯的UITableView NSArrays的NSDictionary中。
本字典阵列的源是包含商店名称的数组,按字母顺序排序:
苹果商店点击 亚特兰大面包公司介绍 边框结果 熊熊工作室点击 嘉吉画廊结果 迪拉兹结果 迪克体育用品结果 埃迪Baure结果 提箱结果 GameStop的结果 Heizberg钻石结果 LensCrafters亮结果 麦当劳的结果 诺德斯特龙点击 玮伦鞋业结果 Pottery Barn的结果 冬至结果 星巴克咖啡结果 维多利亚的秘密点击 白色谷仓烛业
这是一个从源创建应看起来像这样(在括号中的数据类型)阵列的词典:
根(词典),点击 .... A(阵列),点击 ........苹果商店(串)点击 ........亚特兰大面包公司(字符串)点击 .... B(阵列),点击 ........国界(字符串)点击 ........熊熊工作室(字符串)点击 .... C(阵列),点击 ........嘉吉画廊(字符串)点击 .... d(阵列),点击 ........迪拉兹(字符串)点击 ........迪克体育用品(字符串)点击 ....等等。
阵列的像上述结构的字典填充的TableView并显示这样的:
一个结果 苹果商店点击 亚特兰大面包公司介绍 乙结果 边框结果 熊熊工作室点击 ç结果 嘉吉画廊结果 d点击 迪拉兹结果 迪克体育用品结果 等
这产生阵列的字典最终把最后存储(白色谷仓蜡烛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可以为我提供更好的解决方案。
预先感谢。让我知道如果你需要更多的信息。
解决方案
我觉得你想要做这样的事情:
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];
}