我有一个字典输入数组:
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 loop
内的arrTempKeys
谓词来获取具有相同time
值的所有词典:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"Date == %@",str];
NSArray *arrTemp = [myArray filteredArrayUsingPredicate:pred];
最后,我将此arrTemp
指定为密钥time
的对象,并获得了所需的结果。
我想要的是什么:
我知道有很多其他方法可以获得此输出。但我只想知道是否有任何单KVC
编码行或任何其他最佳方式可用于此事。
答案 0 :(得分: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];
}
答案 1 :(得分:3)
NSDictionary
可以在NSArray
和KVC的帮助下完成此操作。
试试这个:
NSDictionary *myDictionary = [NSMutableDictionary dictionaryWithObjects:myArray
forKeys:[myArray valueForKey:@"time"];
这应该有效,因为NSArray的-valueForKey:
版本返回了每个元素为键返回的值的数组。
警告:虽然上面的代码很简洁,似乎可以解决您的问题,但并非没有一些陷阱。主要的一个是字典只能有一个给定键的值,这意味着如果数组中的两个或多个条目具有相同的键@"time"
值,则只有其中一个(可能是最后)将在结果字典中表示。此外,如果任何条目缺少@"time"
的值,则该条目将以[NSNull null]
作为其键。如上所述,如果有两个或更多个缺少time
值,则只有一个将在字典中表示。
编辑:仔细查看您的问题,我发现项目中的时间不一定是明显的,所以Hot Licks的回答可能对您更有意义。
答案 2 :(得分:0)
不,没有。 KVC允许您导航关键路径,但它不会根据关键路径的内容以这种方式对数据进行整理。