按字母顺序对 NSDictionary 值进行排序

Posted

技术标签:

【中文标题】按字母顺序对 NSDictionary 值进行排序【英文标题】:sort NSDictionary values by key alphabetical order 【发布时间】:2011-09-30 15:00:52 【问题描述】:

我可以获得按值排序的字典键数组,但是如何获得按字典键排序的值数组?我一直在寻找没有运气的地方。任何帮助表示赞赏。

【问题讨论】:

你的字典里的值是什么?它们是 c 类型还是对象? NSNumber 对象是值。我只需要对键进行排序,然后根据该排序从值创建一个对象数组。 【参考方案1】:

这可能有效:

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' 看起来 notFoundMarker 必须包含一些东西。我猜它包含的内容在这个例子中是无关紧要的,因为总是会找到密钥。更新了我的答案。 这个方法是多余的,可以直接从字典中得到一个排序好的数组,不需要先调用allKeys @XAleXOwnZX - 请参阅下面我对您的回答的评论。【参考方案2】:

一种方法是构造排序字典键的数组,然后根据键数组创建另一个值数组:

//Construct array of sorted keys
NSArray keyarray = ... //etc

NSMutableArray valuearray = [[NSMutableArray alloc] init];
for (id key in keyarray) 
    [valuearray addObject:[dict objectForKey:key]];

【讨论】:

我同意并考虑了这一点,但希望有一个不需要枚举的更优雅的解决方案【参考方案3】:

我的经验表明,按键对NSDictionary 进行排序并没有多大用处。尽管在loggingNSDictionary 之后它们似乎已排序,但当需要将它们放入tableview 时,它们不再是有序的。

我建议将键存储在NSArray 属性中,然后根据NSArray 中键的顺序查询NSDictionary 对象。

【讨论】:

【参考方案4】:

我在 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

【讨论】:

以上是关于按字母顺序对 NSDictionary 值进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Matlab 按字母顺序对属性值对进行排序

在 Android 中按字母顺序对 Hashmap 值类型进行排序

当字符串为数字时,如何在考虑值的同时按字母顺序对字符串进行排序?

当字符串是数字时,如何在考虑值的同时按字母顺序对字符串进行排序?

如何按字母顺序对多对多 django-admin 框中的值进行排序?

按字母顺序对 NSMutableArray 进行排序[重复]