0

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

实现这一目标的最佳方法是什么?递归?环形 ?紧固件?

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

例子 :

in.plist out.plist - 仅更改密钥 http://img11.hostingpics.net/pics/698162Capturedcran201306262025.png

in 和 out 字典之间的唯一区别是键名。

我直接在 plist 文件中找到了使用 perl 正则表达式的解决方法:

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

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

4

1 回答 1

2

这有点奇怪,但这基本上就是您想要做的。制作一个新的 NSMutableDictionary。对原始字典进行深度优先遍历,每次遇到键时,在将其设置到新字典之前添加您的数字。这是一个示例实现(用浏览器编写,因此请注意 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);
}

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

于 2013-06-26T19:12:44.227 回答