我很好地搜索了SO,但找不到与此问题相关的任何内容。我有一个自定义对象类,它实现了一个在数组中排序的比较方法。此比较使用NSCaseInsensitiveSearch类的“name”属性。代码如下所示:
- (NSComparisonResult)compare:(Forum *)otherObject {
return [self.name compare:otherObject.name options:(NSCaseInsensitiveSearch)];
}
但是,使用NSCaseInsensitiveSearch会将带有数字的字符串放在带字母的字符串之前。有没有办法做到与此相反,以便数字在字母之后?
答案 0 :(得分:1)
不要只是
return [self.name compare:otherObject.name options:(NSCaseInsensitiveSearch)];
但是做一些额外的检查,例如如果self.name以非数字开头,而otherObject.name以数字开头,则返回NSDescendingOrder,反之亦然。 IOW,做一个数字>非标记。如果两者都是非数字或两者都是数字,则返回已有的数据。
这个小小的控制台程序解释了我的意思:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *array = [NSMutableArray arrayWithObjects:
@"Adam", @"001", @"Bertha", @"3SeriesBMW", @"Colin",
@"Zelda", @"1And1", @"Xaver", @"Kraftwerk", @"TangerineDream",
@"5SeriesBMW", @"0ableTypes", nil];
NSString *sortOrder = @"AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz_0123456789";
[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2)
{
char char1 = [(NSString *)obj1 characterAtIndex: 0];
char char2 = [(NSString *)obj2 characterAtIndex: 0];
int index1;
for (index1 = 0; index1 < sortOrder.length; index1++)
if ([sortOrder characterAtIndex: index1] == char1)
break;
int index2;
for (index2 = 0; index2 < sortOrder.length; index2++)
if ([sortOrder characterAtIndex: index2] == char2)
break;
if (index1 < index2)
return NSOrderedAscending;
else if (index1 > index2)
return NSOrderedDescending;
else
return [(NSString *)obj1 compare: obj2 options: NSCaseInsensitiveSearch];
}];
for (NSString *s in array)
NSLog(@"%@", s);
[pool drain];
return 0;
}
输出结果为:
2011-08-25 14:19:15.538 NumeralSort[5802:707] Adam
2011-08-25 14:19:15.540 NumeralSort[5802:707] Bertha
2011-08-25 14:19:15.540 NumeralSort[5802:707] Colin
2011-08-25 14:19:15.540 NumeralSort[5802:707] Kraftwerk
2011-08-25 14:19:15.541 NumeralSort[5802:707] TangerineDream
2011-08-25 14:19:15.541 NumeralSort[5802:707] Xaver
2011-08-25 14:19:15.541 NumeralSort[5802:707] Zelda
2011-08-25 14:19:15.542 NumeralSort[5802:707] 001
2011-08-25 14:19:15.542 NumeralSort[5802:707] 0ableTypes
2011-08-25 14:19:15.542 NumeralSort[5802:707] 1And1
2011-08-25 14:19:15.543 NumeralSort[5802:707] 3SeriesBMW
2011-08-25 14:19:15.543 NumeralSort[5802:707] 5SeriesBMW
这不是解决方案,但应该让你继续前进。
答案 1 :(得分:1)
使用256-(16位)字符转换数组转换要比较的字符串(假设您只有标准的ASCII字符)。将大多数字符转换为它们自己的值(或小写,以同时处理不区分大小写的函数),但将数字转换为它们的值加上一些数字(例如,0xF000)。然后进行字符串比较。
如果你有ASCII范围之外的字符,那么一次翻译一个字符,正确地复制字符(或更低的套管)为非数字,并将字符复制为字符值加上数字的大数字