【发布时间】:2011-09-30 15:00:52
【问题描述】:
我可以获得按值排序的字典键数组,但是如何获得按字典键排序的值数组?我一直在寻找没有运气的地方。任何帮助表示赞赏。
【问题讨论】:
-
你的字典里的值是什么?它们是 c 类型还是对象?
-
NSNumber 对象是值。我只需要对键进行排序,然后根据该排序从值创建一个对象数组。
标签: objective-c swift nsdictionary
我可以获得按值排序的字典键数组,但是如何获得按字典键排序的值数组?我一直在寻找没有运气的地方。任何帮助表示赞赏。
【问题讨论】:
标签: objective-c swift nsdictionary
这可能有效:
NSArray * sortedKeys = [[dict allKeys] sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];
NSArray * objects = [dict objectsForKeys: sortedKeys notFoundMarker: [NSNull null]];
或在 Swift 中
let objects = dict.keys.sorted().flatMap{ dict[$0] }
或
let objects = dict.sorted{ $0.0 < $1.0 }.map{ $1 }
...这就是为什么你应该开始使用 Swift 开发?
【讨论】:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectsForKeys:notFoundMarker:]: marker is nil'
一种方法是构造排序字典键的数组,然后根据键数组创建另一个值数组:
//Construct array of sorted keys
NSArray keyarray = ... //etc
NSMutableArray valuearray = [[NSMutableArray alloc] init];
for (id key in keyarray) {
[valuearray addObject:[dict objectForKey:key]];
}
【讨论】:
我的经验表明,按键对NSDictionary 进行排序并没有多大用处。尽管在logging 和NSDictionary 之后它们似乎已排序,但当需要将它们放入tableview 时,它们不再是有序的。
我建议将键存储在NSArray 属性中,然后根据NSArray 中键的顺序查询NSDictionary 对象。
【讨论】:
我在 NSDictionary 上创建了一个类别来完成这项工作:
@implementation NSDictionary (Extra)
-(NSArray *) sortedKeys {
return [[self allKeys] sortedArrayUsingSelector:@selector(compare:)];
}
-(NSArray *) allValuesSortedByKey {
return [self objectsForKeys:self.sortedKeys notFoundMarker:[NSNull null]];
}
-(id) firstKey {
return [self.sortedKeys firstObject];
}
-(id) firstValue {
return [self valueForKey: [self firstKey]];
}
@end
【讨论】: