像使用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