按string值sortingstring的NSMutableArray
我用下面的string得到一个string数组,string有一个特定的模式
str1 str51 str3 str4 str4 str10 str39 str31 str191
每个string都以'str'开头,并在其末尾添加一个数字。
是否有一个很好的方法来sorting数组,以便按值的顺序列出string
str1 str3 str4 str10 str31 str31 str39 str51 str191
我可以通过编写一些recursion函数来实现
NSString * firstString = [[strArray objectAtIndex:i].substringFromIndex:3]; NSString * secondString = [[strArray objectAtIndex:i+1].substringFromIndex:3]; if ([firstString intValue] < [secondString intValue]) { //do nothing they order is correct } else { //swap the order of the 2 strings in the array }
但是这是非常基本的代码,Objective-C中有一些机制或更好的代码技巧来更好地处理这种sorting吗?
非常感谢,代码
如果他们都以相同的前缀开始,我相信默认sorting将适当地处理它们。 我的意思是:
[someArray sortUsingSelector:@selector(compare:)];
如果由于某种原因,这不起作用,那么你可以使用一个块。 尝试这个:
NSArray *sortedArray = [someArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { //Default compare, to protect against cast if (![a isKindOfClass:[NSString class]] || ![b isKindOfClass:[NSString class]]) { return ([a compare:b]); } else { NSString *aString = (NSString*) a; NSString *bString = (NSString*) b; int aInt = [[a.substringFromIndex:3] intValue]; int bInt = [[b.substringFromIndex:3] intValue]; return [aInt < bInt]; } }];
你可以这样sorting
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSString * str1 = [(NSString *)obj1 substringFromIndex:3]; NSString * str2 = [(NSString *)obj2 substringFromIndex:3]; return [str1 compare:str2 options:NSNumericSearch]; }];
你可以用你想要的任何行为来定义一个比较函数。 下面的代码将模拟Mac OS中Finder的行为,忽略大小写,并尊重string末尾出现的数字。 但是,顺序依赖于提供的语言环境,所以如果你想要的结果是绝对一致的,你应该select一个语言环境并对其进行硬编码。
int finderSortWithLocale(id string1, id string2, void *locale) { static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch; NSRange string1Range = NSMakeRange(0, [string1 length]); return [string1 compare:string2 options:comparisonOptions range:string1Range locale:(__bridge NSLocale *)locale]; }
您一定要阅读每个选项的文档,以确保它符合您的要求。
要使用这样的比较器来有效地对string数组进行sorting,请使用sortedArrayUsingFunction:context:
method:
NSArray *sortedArray = [stringsArray sortedArrayUsingFunction:finderSortWithLocale context:(__bridge void *)[NSLocale currentLocale]];
创build一个NSSortDescriptor,然后按键排列数组:“description”。 喜欢这个:
NSMutableArray *array = [NSMutableArray arrayWithCapacity:0]; //Your Array of NSStrings NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES]; array = [array sortedArrayUsingDescriptors:@[descriptor]];
NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"datetime" ascending:YES]; NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName]; NSArray *sortedArray = [myArrayNonsort sortedArrayUsingDescriptors:sortDescriptors];
sortedArray = [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare :)];
input:anArray输出:sortedArray
参考文档
- 如何在禁用状态下更改UIButton图像alpha?
- 用NSMutableData iOS观察键值
- 在iOS平台上具有Firebase Cloud Messaging(FCM)和Pusher的丰富推送通知
- 在不使用正则expression式的情况下,计算NSString中单词数量的最有效方法是什么?
- iOS 8的Xcode 6.1 EXC_BREAKPOINT(SIGTRAP)只在捆绑应用程序
- 如何以编程方式捕获播放video的屏幕截图?
- 避免5个常见的iOS App开发错误
- iPhone:当其他视图presentViewController时,如何防止closures键盘
- 如何在导航条下的iOS UITableView?