Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 按键字母顺序对NSDictionary值排序_Objective C_Swift_Nsdictionary - Fatal编程技术网

Objective c 按键字母顺序对NSDictionary值排序

Objective c 按键字母顺序对NSDictionary值排序,objective-c,swift,nsdictionary,Objective C,Swift,Nsdictionary,我可以获得按值排序的字典键数组,但是如何获得按字典键排序的值数组呢?我到处找,运气都不好。感谢您的帮助。这可能有用: NSArray * sortedKeys = [[dict allKeys] sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)]; NSArray * objects = [dict objectsForKeys: sortedKeys notFoundMarker: [NSNull null]]; 还

我可以获得按值排序的字典键数组,但是如何获得按字典键排序的值数组呢?我到处找,运气都不好。感谢您的帮助。

这可能有用:

NSArray * sortedKeys = [[dict allKeys] sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];

NSArray * objects = [dict objectsForKeys: sortedKeys notFoundMarker: [NSNull null]];

还是迅速

let objects=dict.sorted{$0.0<$1.0}.map{$1}

…这就是为什么您应该开始使用Swift进行开发的原因,一种方法是构造排序字典键数组,然后基于键数组创建另一个值数组:

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

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

我的经验表明,按键排序
NSDictionary
没有多大用处。尽管在
日志记录之后
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

你字典里的值是什么?它们是c类型还是对象?NSNumber对象是值。我只需要对键进行排序,然后根据排序的值创建一个对象数组。我同意并考虑了这一点,但希望找到一个更优雅的解决方案,不需要枚举。这对我来说太难了。还不确定原因。
***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u NSCFDICTIONAL OBJECTS ORKEYS:notFoundMarker:::]:标记为nil'
看起来NOTFOUNDMAKER必须包含某些内容。我猜它包含的内容在这个例子中是不相关的,因为钥匙总是可以找到的。更新了我的答案。这个方法是多余的,你可以直接从字典中得到一个排序数组,而不需要先调用allKeys@XAleXOwnZX-见下文我对您答案的评论。
//Construct array of sorted keys
NSArray keyarray = ... //etc

NSMutableArray valuearray = [[NSMutableArray alloc] init];
for (id key in keyarray) {
    [valuearray addObject:[dict objectForKey:key]];
}
@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