我尝试在使用自己的字典时将this link中的代码合并到我自己的应用程序中。然而,我遇到了几个问题。
我的代码生成这种字典(因为我使用Web服务从MySQL数据库中获取此数据):
{audiences = ({
name = ABDUL;
id = 1;
},{
name = ELSA;
id = 2;
},...etc)}
但是,我想要一本这样的字典:
audiences = @{@"B" : @[@"Bear", @"Black Swan", @"Buffalo"],
@"C" : @[@"Camel", @"Cockatoo"],
@"D" : @[@"Dog", @"Donkey"]};
在我的情况下,看起来像这样:
audience = @{@"A":@[@"Abdul"],
@"E":@[@"Elsa"]};
总结我的问题:
1)如何仅使用NSDictionary
s(无name
)创建id
?
2)字典包括其中的首字母
感谢您的帮助,我是Xcode和Objective-C的新手,所以如果我问一个菜鸟问题,请原谅我。另外,请忍受我糟糕的英语。提前谢谢。
答案 0 :(得分:1)
因此,从Web服务收到的初始数据结构是(在Cocoa中重新表达):
NSDictionary* data = @{ @"audiences" : @[
@{ @"name" : @"ABDUL",
@"id" : @1 },
@{ @"name" : @"ELSA",
@"id" : @2 },
] };
您可以像这样构建您描述的数据结构:
NSMutableDictionary* audience = [NSMutableDictionary dictionary];
for (NSDictionary* person in data[@"audiences"])
{
NSString* name = person[@"name"];
if (![name length])
continue;
NSRange range = [name rangeOfComposedCharacterSequenceAtIndex:0];
NSString* key = [[name substringWithRange:range] uppercaseString];
NSMutableArray* list = audience[key];
if (!list)
{
list = [NSMutableArray array];
[audience setObject:list forKey:key];
}
[list addObject:name];
}
答案 1 :(得分:0)
我将假设您不希望首字母区分大小写。
NSArray *audiences = @[
@{ @"name" : @"ABDUL", @"id" : @1 },
@{ @"name" : @"ELSA", @"id" : @2 },
@{ @"name" : @"erik erikson", @"id" : @3 },
@{ @"name" : @"Leeroy Jenkins", @"id" : @-1 },
@{ @"name" : @"", @"id" : @4 },
];
NSMutableDictionary *audienceMembersByInitial = [NSMutableDictionary dictionary];
for (NSDictionary *audienceMember in audiences) {
NSString *name = audienceMember[@"name"];
if (name.length > 0) {
NSString *initial = [[name substringToIndex:1] uppercaseString];
NSArray *audienceMembersWithInitial = audienceMembersByInitial[initial] ?: @[];
audienceMembersByInitial[initial] = [audienceMembersWithInitial arrayByAddingObject:name];
}
}
return [audienceMembersByInitial copy];
输出是......
@{
@"A" : @[ @"ABDUL" ],
@"E" : @[ @"ELSA", @"erik erikson" ],
@"L" : @[ @"Leeroy Jenkins" ],
};