我见过很多按键排序字典的例子,然后获取值,但我如何按值排序。
e.g。
{
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;
}
}];
答案 0 :(得分:10)
从概念上讲,NSDictionary是未分类的,正如C0deH4cker已经说过的那样。
如果您需要订单,您可以将密钥写入数组(但是在从字典中删除密钥后,您可能会遇到阻止它的数组,但有教程如何创建{{3} })或un-retaining array by using the CFArray。
或者你可以继承NSDictionary - 不是很简单,因为NSDictionary是一个类集群。但幸运的是,马特在他精彩的博文NSSortedSet中展示了如何使用一个小技巧,一个涵盖的有一个的关系。
请注意,您的代码
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;
}];
答案 1 :(得分:0)
根据定义,字典是无序的。可以使用哈希表来访问它们以获得速度。您能够“订购”它的唯一方法是选择不同的数据类型。韧皮数据类型取决于您的意图。
答案 2 :(得分:0)
或者您可以直接对NSString键进行排序,如:
NSArray* sortedKeys = [sortedKeys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
NSNumber *A = @([obj1 LongValue]);
NSNumber *B = @([obj2 LongValue]);
return [A compare:B];
} ];