创建具有要排序的初始名称的NSDictionary

时间:2014-08-27 04:41:04

标签: ios objective-c nsdictionary

我尝试在使用自己的字典时将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的新手,所以如果我问一个菜鸟问题,请原谅我。另外,请忍受我糟糕的英语。提前谢谢。

2 个答案:

答案 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" ],
};