2010-02-03 40 views
1

我有按字母顺序排序忽略的字母的情况下的对象的列表的阵列(使用lowerCaseString法),我需要将其分类到阵列一项的用于非字母字符的每个字母1阵列。索引按字母顺序排序的列表

做将是通过源阵列环与一个巨大的27堆深if else if else if else...的一个简单的方法。不用说,我不认为这是一个很好的解决方案,所以我想如果我可以将我排序的字符串的第一个字母转换为一个int,然后可以使用它来计算索引以将对象排序为。

所以我需要帮助来实现这个或找到一个更好的方式来做到这一点。

我工作在iPhone平台上的,所以我有机会到可可和核心苹果图书馆的。

回答

3

您可以使用“排序”的NSMutableArray,它会牵着你的27“信”的NSMutableArray对象每持有你的对象。

您也可以使用26个字母的NSArray(作为NSString对象),并使用indexOfObject:从对象应该添加到的“letter”数组的“sorted”数组中获取索引(如果它返回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); 
+0

非常感谢的是,工作一种享受。 – Affian 2010-02-03 21:37:46

3

在普通的C,str[0] - 'a'会给你0的整数为25开头的小写字母字符的字符串。然后你只需要一个if来检查非alpha字母的初始字符。