像使用NSSortDescriptor的NSInteger一样对NSString值进行sorting

我创build了一个sorting描述符来sorting来自我的服务器的plist响应。 这与sorting键的值高达9的效果很好。有超过10个项目,我看到突变结果sorting键排列顺序= 1,10,11,2,3,4,5,6,7,8,9

NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sort" ascending:YES]; self.myList = [NSMutableArray arrayWithArray:[unsortedList sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]]; 

如何按照1,2,3,4,5,6,7,8,9,10,11的顺序排列?

你可以通过在创build你的NSSortDescriptor时实现一个自定义的比较器块来实现:

 NSSortDescriptor *aSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"sort" ascending:YES comparator:^(id obj1, id obj2) { if ([obj1 integerValue] > [obj2 integerValue]) { return (NSComparisonResult)NSOrderedDescending; } if ([obj1 integerValue] < [obj2 integerValue]) { return (NSComparisonResult)NSOrderedAscending; } return (NSComparisonResult)NSOrderedSame; }]; self.myList = [NSMutableArray arrayWithArray:[unsortedList sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]]; 

请参阅此处的 Apple文档

[list sortUsingSelector:@selector(localizedStandardCompare:)]; 将以“人”的方式对列表进行sorting(因此“11”将在最后,而不是在“1”和“2”之间)。 但是,如果你真的想把这些string当作数字来对待,那么应该先把它们编成数字!

 NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sort.intValue" ascending:YES]; self.myList = [NSMutableArray arrayWithArray:[unsortedList sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]]; 

根据整数的值进行sorting。

您需要将您的string与NSNumericSearch选项进行比较:

NSNumericSearch
string中的数字使用数值进行比较,即Name2.txt < Name7.txt < Name25.txt

这需要compare:options:方法来进行比较。

为了做到这一点,你的sorting描述符可以使用NSComparator块 :

 [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES comparator:^(NSString * string1, NSString * string2){ return [string1 compare:string2 options:NSNumericSearch]; }]; 

或者的确,您可以跳过sorting描述符,并直接使用相同的块对数组进行sorting :

 [unsortedList sortedArrayUsingComparator:^NSComparisonResult (NSString * string1, NSString * string2){ return [string1 compare:string2 options:NSNumericSearch]; }]; 
 NSMutableArray *list = [NSMutableArray arrayWithObjects:@"11",@"2",@"3",@"1", nil]; [list sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSInteger firstInteger = [obj1 integerValue]; NSInteger secondInteger = [obj2 integerValue]; if( firstInteger > secondInteger) return NSOrderedDescending; if( firstInteger == secondInteger) return NSOrderedSame; return NSOrderedAscending; // edited }]; 

没有关于性能的保证

以上所有方法都需要有较好的基础知识实施, 但对于新手我build议最简单的方法 – 使用本地块的方法

 NSArray* sortedArr =[fetchResults sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { int aValue = [[a valueForKey:@"subgroupId"] intValue]; int bValue = [[b valueForKey:@"subgroupId"] intValue]; return aValue > bValue; }]; 

input

 { "seats": [{ "seatNumber": "1" }, { "seatNumber": "10" }, { "seatNumber": "2" }] } 

使用[NSSortDescriptor sortDescriptorWithKey:@“seatNumber”升序sorting:YES selector:@selector(localizedStandardCompare :)]]。 关键是使用localizedStandardCompare。 这将解决你的问题。

 NSArray *seats = [self.seats sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"seatNumber" ascending:YES selector:@selector(localizedStandardCompare:)]]]; 

产量

 { "seats": [{ "seatNumber": "1" }, { "seatNumber": "2" }, { "seatNumber": "10" }] } 

文档: https : //developer.apple.com/documentation/foundation/nsstring/1409742-localizedstandardcompare