如何将字典的键转换为一个数组,该数组按字典中这些键对应的值排序

时间:2014-04-25 22:16:50

标签: ios sorting nsarray nsdictionary

我有一本字典。它的键是字符串,其值是NSDates。例如:

{ A : <jan 1>, B : <mar 1>, C : <feb 1> }

我想从字典(A,B和C)中的键创建一个数组,按日期排序。所以我应该得到以下数组:

[A, C, B]

我怎样才能做到这一点?

奖励积分:使用这个排序的数组,我可以完成我的最终目标,但排序的数组只是一个中间人;最优雅的解决方案不需要它。我真正想要做的是对一个对象数组进行排序,每个对象都有一个属性值,对应于字典中的一个。例如:

[obj1, obj2, obj3]

,其中

obj1.prop = A
obj2.prop = B
obj3.prop = C

我想根据A,B和&amp;的日期值对该数组进行排序。 C,引用字典。所以我在这种情况下的最终目标是以下数组:

[obj1, obj3, obj2]

谢谢!

3 个答案:

答案 0 :(得分:4)

在David的回答的基础上,这将解决所有问题:

NSDictionary* items = @{ @"A":date1, @"B":date2, @"C":date3 };
NSArray *objectsArray = @{ obj1, obj2, obj3 };
NSArray *sortedObjectsArray = [objectsArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSDate *date1 = [items objectForKey:obj1.prop];
    NSDate *date2 = [items objectForKey:obj2.prop];
    return [date1 compare:date2];
}];

答案 1 :(得分:2)

以下内容将实现您的第一个目标:

NSDictionary*   items = @{ @"A":@2, @"B":@1, @"C":@3};
keys = [[items allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [items[obj1] compare:items[obj2]];
}];

由此你应该能够推断出你的其他问题的答案。

答案 2 :(得分:0)

这应该完成你的第二个问题

NSSortDescriptor *sortDescrip = [[NSSortDescriptor alloc] initWithKey:@"prop"
                                              ascending:YES];
NSArray *sortDescrips = [NSArray arrayWithObject:sortDescrip];
NSArray *sortedArray = [originalArray sortedArrayUsingDescriptors:sortDescrips];