NSMutableDictinary - 为所有键添加前缀

时间:2013-06-26 18:33:44

标签: objective-c plist nsdictionary nsmutabledictionary

我有一个NSMutableDictionary * A(来自in.plist)。我需要通过自动重构的整数为A中的每个键和A的后代字典添加前缀,并将结果保存在NSMutableDictionary B中(保存为out.plist)。

实现这一目标的最佳方法是什么?递归?循环? Fastenum?

PS:我们事先不知道字典A的结构。它可以包括字典数组字典......等等

示例:

in.plist out.plist - Change only the key http://img11.hostingpics.net/pics/698162Capturedcran201306262025.png

输入和输出字典之间唯一的区别是键名。

我在plist文件中找到了perl regex的解决方法:

cat in.plist | perl -ne 's/<key>/sprintf("<key>%02d -",($INDEX++))/xe;print $_' > out.plist

像魅力一样,但更喜欢Objective-c方式。

1 个答案:

答案 0 :(得分:2)

这有点奇怪,但这基本上是你想要做的。创建一个新的NSMutableDictionary。对原始字典进行深度优先遍历,每次遇到密钥时,在将其设置到新字典之前添加前面的数字。这是一个示例实现(用浏览器编写,所以 caveat executor ):

NSDictionary *numberDict(NSDictionary *original) {
    __block int counter = 1;

    __block id (^processItem)(id);
    processItem = ^(id item) {
        id result = item;
        if ([item isKindOfClass:[NSArray class]]) {
            result = [NSMutableArray array];
            [item enumerateObjectsUsingBlock:^(id arrayElement, NSUInteger index, BOOL *stop) {
                [result addObject:processItem(arrayElement)];
            }];
        } else if ([item isKindOfClass:[NSDictionary class]]) {
            result = [NSMutableDictionary dictionary];
            [item enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *stop) {
                NSString *newKey = [NSString stringWithFormat:@"%d - %@", counter++, key];
                [result setObject:processItem(value) forKey:newKey];
            }];
        }
        return result;
    };
    return processItem(original);
}

显然这不会保留字典键的顺序,因为字典键实际上没有要保留的顺序,但是你已经表明你已经知道并且可以使用它。