我正在尝试将NSMutableDictionary
的键及其各自的值(值按升序排列)排序。我的代码段如下:
NSArray *sortedKeysWithValues = [[myDict allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [[myDict objectForKey:obj2] compare:[myDict objectForKey:obj1]];}];
NSMutableDictionary
的内容是:
{
806: "-89.06";
802: "-75.12";
837: "-77.76";
803: "-84.75";
808: "-115";
804: "-102.12";
813: "-115";
805: "-115";
801: "-67.53";
836: "-70.36";
}
执行上述代码后,sortedKeyWithValues
上的内容变为:
(
806,
803,
837,
802,
836,
801,
808,
813,
805,
804,
)
请注意,具有最高值的键位于5th
的{{1}}索引处。 sortedKeyWithValues
最高值的键在2nd
索引上,依此类推。它一直持续到第一个索引。第一个索引旁边的值的键位于4th
的最后一个索引处,直到最后一个索引。
我期望的sortedKeyWithValues
对象的顺序是:
sortedKeyWithValues
使用(
801,
836,
802,
837,
803,
806,
804,
805,
813,
808,
)
时出现这种奇怪结果的原因可能是什么?是由于该方法的错误还是我这边的一些愚蠢的错误?
谢谢!
答案 0 :(得分:1)
只有几点注意事项:
1)比较调用中的myDict是什么?
2)在回调中,通常必须在obj1 / obj2内获取值并比较其中的数据成员: (最终将其投放...) 例如:
NSArray *sortedPeople = [self.persons sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
Person *p1 = (Person *)obj1;
Person *p2 = (Person *)obj2;
return [p1.surname compare:p2.surname];
}];
所以我需要知道您为什么使用MyDict。
答案 1 :(得分:1)
之所以会这样,是因为NSDictionary
的值为NSStrings
。 compare:
正在按字母顺序排序。
根据您的代码进行的快速而肮脏的修复:
NSArray *sortedKeysWithValues = [[dic allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [@([dic[obj2] doubleValue]) compare:@([dic[obj1] doubleValue])];}];
答案 2 :(得分:1)
这不是错误。您正在比较字符串而不是数字。
$ cat /proc/sys/net/ipv4/ip_forward
1
具有专用的方法NS(Mutable)Dictionary
,用于按值对键进行排序,选择器keysSortedByValueUsingSelector
对数字进行字符串排序。不需要localizedStandardCompare
API。
comparator
或者使用带有选项NSArray *sortedKeysWithValues = [myDict keysSortedByValueUsingSelector:@selector(localizedStandardCompare:)];
的比较器
NSNumericSearch
答案 3 :(得分:1)
尝试这样做:
NSArray *myArray;
myArray = [myDict keysSortedByValueUsingComparator: ^(id obj1, id obj2) {
if ([obj1 doubleValue] > [obj2 doubleValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 doubleValue] < [obj2 doubleValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];