Objective-C

时间:2018-08-08 06:30:10

标签: ios objective-c nsdictionary sorteddictionary

我正在尝试将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, ) 时出现这种奇怪结果的原因可能是什么?是由于该方法的错误还是我这边的一些愚蠢的错误?

谢谢!

4 个答案:

答案 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的值为NSStringscompare:正在按字母顺序排序。

根据您的代码进行的快速而肮脏的修复:

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;
}];