长期的视窗开发人员,第一次使用Objective-C/iPhone开发人员想要创建一个NSArrays的NSDictionary,它可以显示在带有字母部分的纯UITableView中。
此数组字典的源是一个包含按字母顺序排序的商店名称的数组:
苹果商店
亚特兰大面包公司
边框
构建熊工作坊
嘉吉画廊
迪拉德
迪克的体育用品
埃迪·鲍尔
FootLocker
GameStop
海兹堡钻石
LensCrafters
麦当劳
诺德斯特龙
无偿鞋源
陶器仓库
冬至
星巴克咖啡
维多利亚的秘密
白谷仓蜡烛公司。
从源代码创建的数组字典应该如下所示(括号中的数据类型):
词根(字典)
....A (数组)
........Apple存储(字符串)
........Atlanta面包公司(字符串)
....B (数组)
........Borders (字符串)
.......Build-A-Bear研讨会(字符串)
....C (数组)
........Cargill库(字符串)
....D (数组)
........Dillards (字符串)
......Dick‘s Sporting Goods (字符串)
....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的人可以为我提供一个更优雅的解决方案。
提前谢谢。如果你需要更多信息,请告诉我。
发布于 2009-09-19 01:23:55
我认为你想做这样的事情:
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];
}https://stackoverflow.com/questions/1447376
复制相似问题