【问题标题】:Sorting an Array with Strings that contains Numbers [duplicate]使用包含数字的字符串对数组进行排序[重复]
【发布时间】:2012-11-12 23:11:19
【问题描述】:
可能重复:
Sorting NSString values as if NSInteger using NSSortDescriptor
我有一个数组,用我的 NSMutableDictionary.. 填充,我使用这个:
myArray =[[myDict allKeys]sortedArrayUsingSelector:@selector(IDONTKNOW:)];
myDicts 的 AllKeys 是 NSStrings...比如 123.423 或 423.343...我需要按递增数字对新的 myArray 进行排序...12.234 45.3343 522.533 5432.66 等
必须在@selector 中插入什么才能正确执行此操作?谢谢
【问题讨论】:
标签:
objective-c
xcode
arrays
【解决方案1】:
您可以使用NSSortDescriptor 并传递doubleValue 作为密钥。
//sfloats would be your [myDict allKeys]
NSArray *sfloats = @[ @"192.5235", @"235.4362", @"3.235", @"500.235", @"219.72" ];
NSArray *myArray = [sfloats sortedArrayUsingDescriptors:
@[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue"
ascending:YES]]];
NSLog(@"Sorted: %@", myArray);
【解决方案2】:
您不能直接使用sortedArrayUsingSelector:。使用sortedArrayUsingComparator: 并自己实现一个比较块。
有点像这样的q/a:
Changing the sort order of -[NSArray sortedArrayUsingComparator:]
(事实上,该问题的代码可能会被复制/粘贴到您的代码中,一旦您将它从 integerValue 更改为 doubleValue 以进行四个转换字符串到数字调用,它就会“正常工作” ):
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
double n1 = [obj1 doubleValue];
double n2 = [obj2 doubleValue];
if (n1 > n2) {
return (NSComparisonResult)NSOrderedDescending;
}
if (n1 < n2) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
【解决方案3】:
考虑sortedArrayUsingFunction:。这允许您定义在比较元素时使用的自定义比较函数。
myArray =[[myDict allKeys]sortedArrayUsingFunction:SortAsNumbers context:self];
NSInteger SortAsNumbers(id id1, id id2, void *context)
{
float v1 = [id1 floatValue];
float v2 = [id2 floatValue];
if (v1 < v2) {
return NSOrderedAscending;
} else if (v1 > v2) {
return NSOrderedDescending;
}
return NSOrderedSame;
}
更多信息在这里:Sort NSArray using sortedArrayUsingFunction