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我添加了一个替代方案