2

我有一个字典输入数组

myArray = (
    {
        name:"abc";
        time:"6:00";
    },
    {
        name:"xyz";
        time:"7:00";
    },
    .
    .
)

我想要这样的输出字典

myDictionary = {
    "6:00":(
        {
            name:"abc";
            time:"6:00";
        },
        .
        .
     )
     "7:00":(
        {
            name:"xyz";
            time:"7:00";
        },
        .
        .
     )
}

我尝试了什么:

distinct times我成功地得到了一个使用这条线的数组:

NSArray *arrTempKeys = [myArray valueForKeyPath:@"@distinctUnionOfObjects.Time"];

然后使用 for 内部的谓词for looparrTempKeys获取所有具有相同time值的字典:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"Date == %@",str];
NSArray *arrTemp = [myArray filteredArrayUsingPredicate:pred];

最后,我将其分配arrTemp为 Key 的 Objecttime并获得了所需的结果。


我想要的是 :

我知道还有很多其他方法可以得到这个输出。但我只想知道是否有任何单一的KVC编码行或任何其他最佳方式可以做这件事。

4

3 回答 3

4

你想要的太多了。只写一个简单的循环。这将是最有效、最清晰、可能也是最可靠的解决方案:

NSMutableDictionary* myDict = [NSMutableDictionary dictionary];
for (NSDictionary* innerDict in myArray) {
    NSString* time = innerDict[@"time"];
    NSMutableArray* innerArray = myDict[time];
    if (innerArray == nil) {
        innerArray = [NSMutableArray array];
        [myDict setValue:innerArray forKey:time];
    }
    [innerArray addObject:innerDict];
}
于 2014-03-10T15:38:55.923 回答
3

NSDictionaryNSArray可以在KVC的协助下做到这一点。

尝试这个:

NSDictionary *myDictionary = [NSMutableDictionary dictionaryWithObjects:myArray
                                                                forKeys:[myArray valueForKey:@"time"];

这应该可行,因为 NSArray 的版本-valueForKey:返回一个数组,该数组由它的每个元素返回的值组成。

警告:虽然上面的代码很简洁并且似乎可以解决您的问题,但它并非没有一些陷阱。主要的一个是字典对于给定的键只能有一个值,这意味着如果数组中的两个或多个条目具有相同的键值@"time",则只会表示其中一个(可能是最后一个)在结果字典中。此外,如果任何条目缺少 的值@"time",则该条目将[NSNull null]作为其键。如上,如果有两个或多个缺失time值,则字典中只会表示一个。

编辑:更仔细地查看您的问题,我发现项目中的时间不一定不同,因此 Hot Licks 的回答可能对您更有意义。

于 2014-03-10T15:25:24.573 回答
0

不,没有。KVC 允许您导航关键路径,但它不会根据关键路径的内容以这种方式对数据进行整理。

于 2014-03-10T13:25:25.477 回答