gpt4 book ai didi

iphone - 如何让sortedArrayUsingSelector使用整数而不是字符串进行排序?

转载 作者:行者123 更新时间:2023-12-03 18:40:35 24 4
gpt4 key购买 nike

我有一些这样的数据:

1、111、2、333、45、67、322、4445

NSArray *array = [[myData allKeys]sortedArrayUsingSelector: @selector(compare:)];

如果我运行这段代码,它会像这样排序:

1, 111, 2,322, 333, 4445, 45, 67,

但我实际上想要这个:

1, 2, 45, 67, 111, 322, 333, 4445

我该如何实现它?谢谢你。

最佳答案

扩展 Paul Lynch 的答案,下面是我使用比较方法作为 NSString 上的类别来执行此操作的示例。此代码仅处理数字后跟可选非数字限定符的情况,但如果需要,您可以将其扩展以处理“1a10”等情况。

创建类别方法后,您只需执行以下操作

[[myData allKeys]sortedArrayUsingSelector:@selector(psuedoNumericCompare:)];

@interface NSString (Support) 
- (NSComparisonResult) psuedoNumericCompare:(NSString *)otherString;
@end

@implementation NSString (Support)

// "psuedo-numeric" comparison
// -- if both strings begin with digits, numeric comparison on the digits
// -- if numbers equal (or non-numeric), caseInsensitiveCompare on the remainder

- (NSComparisonResult) psuedoNumericCompare:(NSString *)otherString {

NSString *left = self;
NSString *right = otherString;
NSInteger leftNumber, rightNumber;


NSScanner *leftScanner = [NSScanner scannerWithString:left];
NSScanner *rightScanner = [NSScanner scannerWithString:right];

// if both begin with numbers, numeric comparison takes precedence
if ([leftScanner scanInteger:&leftNumber] && [rightScanner scanInteger:&rightNumber]) {
if (leftNumber < rightNumber)
return NSOrderedAscending;
if (leftNumber > rightNumber)
return NSOrderedDescending;

// if numeric values tied, compare the rest
left = [left substringFromIndex:[leftScanner scanLocation]];
right = [right substringFromIndex:[rightScanner scanLocation]];
}

return [left caseInsensitiveCompare:right];
}

关于iphone - 如何让sortedArrayUsingSelector使用整数而不是字符串进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com