Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
Ios 使用Objective-C中的Comparator进行排序时出现意外结果_Ios_Objective C_Nsdictionary_Sorteddictionary - Fatal编程技术网

Ios 使用Objective-C中的Comparator进行排序时出现意外结果

Ios 使用Objective-C中的Comparator进行排序时出现意外结果,ios,objective-c,nsdictionary,sorteddictionary,Ios,Objective C,Nsdictionary,Sorteddictionary,我正在尝试将NSMutableDictionary的键与其各自的值(值按升序)排序。我的代码片段如下所示: NSArray *sortedKeysWithValues = [[myDict allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){ return [[myDict objectForKey:obj2] compare:[myDict objectForKey:obj1]];}]; NSMu

我正在尝试将
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,
) 
请注意,具有最高值的键位于
sortedKeyWithValues
5th
索引处。第二个最大值的键位于第四个索引上,依此类推。它一直持续到第一个索引。值位于第一个索引旁边的键位于
sortedKeyWithValues
的最后一个索引,它上升到第六个索引

我期望的
sortedKeyWithValues
中对象的顺序是:

(
801,
836,
802,
837,
803,
806,
804,
805,
813,
808,
)
使用Comparator时出现这种奇怪结果的原因是什么?这是因为方法上的错误还是我这边的愚蠢错误


谢谢大家!

只有几个注意事项:

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) 什么是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。

这是因为
NSDictionary
的值是
NSStrings
<代码>比较:正在按字母顺序排序

基于您的代码的快速修复:

NSArray *sortedKeysWithValues = [[dic allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [@([dic[obj2] doubleValue]) compare:@([dic[obj1] doubleValue])];}];

这是因为
NSDictionary
的值是
NSStrings
<代码>比较:正在按字母顺序排序

基于您的代码的快速修复:

NSArray *sortedKeysWithValues = [[dic allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [@([dic[obj2] doubleValue]) compare:@([dic[obj1] doubleValue])];}];

这不是虫子。您正在比较字符串而不是数字

NS(可变)字典
有一个专用的方法
keysSortedByValueUsingSelector
按值对键进行排序,选择器
localizedStandardCompare
对字符串进行数字排序。不需要
比较器
API

NSArray *sortedKeysWithValues = [myDict keysSortedByValueUsingSelector:@selector(localizedStandardCompare:)];
或者将比较器与选项
NSNumericSearch

id numericSort = ^(NSString * key1, NSString * key2) {
    return [key1 compare:key2 options: NSNumericSearch];
};

NSArray *sortedKeysWithValues = [dictionary keysSortedByValueUsingComparator:numericSort];

这不是虫子。您正在比较字符串而不是数字

NS(可变)字典
有一个专用的方法
keysSortedByValueUsingSelector
按值对键进行排序,选择器
localizedStandardCompare
对字符串进行数字排序。不需要
比较器
API

NSArray *sortedKeysWithValues = [myDict keysSortedByValueUsingSelector:@selector(localizedStandardCompare:)];
或者将比较器与选项
NSNumericSearch

id numericSort = ^(NSString * key1, NSString * key2) {
    return [key1 compare:key2 options: NSNumericSearch];
};

NSArray *sortedKeysWithValues = [dictionary keysSortedByValueUsingComparator:numericSort];
尝试这样做:

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;
}];
NSArray*myArray;
myArray=[myDict KeysSortedByValue UsingComparator:^(id obj1,id obj2){
如果([obj1 doubleValue]>[obj2 doubleValue]){
返回(NSComparisonResult)或撤销;
}
如果([obj1 doubleValue]<[obj2 doubleValue]){
返回(NSComparisonResult)或删除;
}
返回(NSComparisonResult)命令名;
}];
尝试执行以下操作:

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;
}];
NSArray*myArray;
myArray=[myDict KeysSortedByValue UsingComparator:^(id obj1,id obj2){
如果([obj1 doubleValue]>[obj2 doubleValue]){
返回(NSComparisonResult)或撤销;
}
如果([obj1 doubleValue]<[obj2 doubleValue]){
返回(NSComparisonResult)或删除;
}
返回(NSComparisonResult)命令名;
}];

好主意,请记住,
本地化标准比较:
订单将来可能会更改releases@Aris我添加了另一个好主意,请记住,
localizedStandardCompare:
order将来可能会更改releases@Aris我添加了一个替代方案