我有一个数组,其中的对象列表按字母顺序排序,忽略了字母大小写(使用了lowerCaseString
方法),我需要将其排序为一个数组,每个字母对应一个非字母字符+1。
一种简单的方法是使用一个巨大的27堆深if else if else if else...
来遍历源数组。毋庸置疑,我不认为这是一个非常好的解决方案所以我在想是否可以将我正在排序的字符串的第一个字母转换为int然后我可以使用它来计算索引以将对象排序为
所以我需要帮助实现这个或找到更好的方法来实现它。
我正在iPhone平台上工作,所以我可以访问可可和核心苹果图书馆。
答案 0 :(得分:3)
在常规c中,对于以小写字母字符开头的字符串,str[0] - 'a'
将为您提供0到25之间的整数。然后你只需要一个if
来检查非alpha初始字符。
答案 1 :(得分:3)
您可以使用“已排序”的NSMutableArray,它会保存您的27个“字母”NSMutableArray对象,每个对象都包含您的对象。
您还可以使用26个字母的NSArray(作为NSString对象)并使用indexOfObject:
从“字母”数组的“已排序”数组中获取索引,该数组应该添加对象(如果是返回NSNotFound,使用26作为索引,因为这是你的非alpha数组。)
例如,如果要对NSString对象进行排序,可以这样做:
NSArray *originalArray = [NSArray arrayWithObjects:@"A object",@"B object",@"C object",@"123 object",nil];
// init with all 26 lowercase letters here
NSArray *letters = [NSArray arrayWithObjects:@"a",@"b",@"c",nil];
// create sorted and letter arrays
NSMutableArray *sortedArray = [[NSMutableArray alloc] initWithCapacity:[letters count]+1];
for (int i = 0; i < [letters count] + 1; i++) {
// use an appropriate capacity here
NSMutableArray *letterArray = [[NSMutableArray alloc] initWithCapacity:10];
[sortedArray addObject:letterArray];
[letterArray release];
}
// sort originalArray into sortedArray
for (NSString *string in originalArray) {
NSString *firstLetter = [[string substringWithRange:[string rangeOfComposedCharacterSequenceAtIndex:0]] lowercaseString];
int index = [letters indexOfObject:firstLetter];
if (index == NSNotFound) {
// use non-alpha array
index = [letters count];
}
NSMutableArray *letterArray = [sortedArray objectAtIndex:index];
[letterArray addObject:string];
}
NSLog(@"%@",sortedArray);