2011-08-25 42 views
3

我对SO有很好的搜索,但找不到与此问题相关的任何内容。我有一个自定义对象类,实现了在数组中进行排序的比较方法。此比较使用NSCaseInsensitiveSearch类的“name”属性。代码如下所示:用数字排序的字符串最后一个目标c

- (NSComparisonResult)compare:(Forum *)otherObject { 
return [self.name compare:otherObject.name options:(NSCaseInsensitiveSearch)]; 
} 

但是,使用NSCaseInsensitiveSearch会将数字字符串放在带字母的字符串之前。有没有办法做到这一点相反,以便数字在字母后面出现?

回答

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_"; 

    [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 

这是不完全的解决方案,但应该让你对你的方式。

+0

这工作的一种享受,感谢您的帮助! – steemcb

+0

我如何在NSSortDescriptor中使用它? – Raj

1

使用256-(16位)字符转换数组(假设您只有标准的ASCII字符)转换要比较的字符串。将大多数字符转换为它们自己的值(或小写,同时处理不区分大小写的函数),但将数字转换为它们的值加上一些数字(例如0xF000)。然后做字符串比较。

如果您有超出ASCII范围的字符,请一次翻译一个字符,将字符完全复制(或更低 - 大小写)为非数字,然后复制字符作为字符值加上该大数字数字。

相关问题