我看过很多按键对字典进行排序然后获取值的示例,但我该如何改为按值排序。
例如
{
blue:12;
red:50;
white:44;
}
我希望这些按数字降序排列到:
{
red:50;
white:44;
blue:12
}
我尝试获取一个排序的 nsarray 键,我可以从中创建有序的 nsarray,但结果似乎仍然是无序的。
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
if ( first < second ) {
return (NSComparisonResult)NSOrderedAscending;
} else if ( first > second ) {
return (NSComparisonResult)NSOrderedDescending;
} else {
return (NSComparisonResult)NSOrderedSame;
}
}];
最佳答案
从概念上讲,NSDictionary 是未排序的,正如 C0deH4cker 所说。
如果您需要一个订单,您可以将键写入一个数组(但是当键从字典中删除后,您可能无法让数组保留它,但是有教程如何创建一个 un-retaining array by using the CFArray )或 NSSortedSet .
或者你可以将 NSDictionary 子类化——这不是很简单,因为 NSDictionary 是一个类簇。但幸运的是,马特在他精彩的博文中展示了 "OrderedDictionary: Subclassing a Cocoa class cluster"如何使用一个小技巧,覆盖 has-a 关系。
请注意,您的代码
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
if ( first < second ) {
return (NSComparisonResult)NSOrderedAscending;
} else if ( first > second ) {
return (NSComparisonResult)NSOrderedDescending;
} else {
return (NSComparisonResult)NSOrderedSame;
}
}];
不会做您想要它做的事情,因为您正在将 C 运算符应用于对象。现在他们的指针将被排序。
应该是这样的
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
return [first compare:second];
}];
或者如果你想在标量上排序,它是作为对象的包装器(即 NSNumber)
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
if ([first integerValue] > [second integerValue])
return (NSComparisonResult)NSOrderedDescending;
if ([first integerValue] < [second integerValue])
return (NSComparisonResult)NSOrderedAscending;
return (NSComparisonResult)NSOrderedSame;
}];
关于objective-c - 按字典值将 NSDictionary 键排序为 NSArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11217421/