2011-07-27 147 views
9

我有一個字符串數組(名稱)排序NSArray的排序

,我想他們喜歡iPhone上的通訊錄如何對它們進行分類排序

  • 例如:伊萊 - >電子商務下
  • 如:阿里 - >下的
  • 如:4li - >下#

有什麼建議?

回答

11

您需要對字符串執行變音不敏感的比較。 NSString有一個compare:options:方法,可選NSDiacriticInsensitiveSearch

NSArray *array = [NSArray arrayWithObjects:@"éli", @"bob", @"earl", @"allen", @"àli", @"aaron", nil]; 

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [(NSString*)obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch]; 
}]; 

編輯:

這裏是一個完整的例子,將部分基於第一個字符的結果區分符號不敏感。我放入一本詞典,因此您需要自行跟蹤排序的鍵以正確顯示。

NSArray *array = [NSArray arrayWithObjects:@"éli", @"bob", @"earl", @"allen", @"àli", nil]; 

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [(NSString*)obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch]; 
}]; 

NSMutableDictionary *sectioned = [NSMutableDictionary dictionary]; 
NSString *firstChar = nil; 

for(NSString *str in sorted) 
{ 
    //Ignore empty strings 
    if(![str length])continue; 

    NSMutableArray *names = nil; 

    //Compare the first character using diacritic insensitive search 
    if([str compare:firstChar options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch range:NSMakeRange(0, 1)] == NSOrderedSame) 
    { 
     names = [sectioned objectForKey:firstChar]; 
    } 
    else 
    { 
     //decomposedStringWithCanonicalMapping is where the magic happens 
     //(it removes the accent mark) 
     firstChar = [[str decomposedStringWithCanonicalMapping] substringToIndex:1]; 
     names = [NSMutableArray array]; 
     [sectioned setObject:names forKey:firstChar]; 
    } 

    [names addObject:str]; 
} 

NSLog(@"sorted: %@", sorted); 
//This is sectioned like the address app 
NSLog(@"sectioned: %@", sectioned); 
+0

是否有可能在一個名爲「name」的屬性的自定義對象數組上執行此操作 –

+0

是在比較內部而不是將obj1作爲'NSString'強制轉換爲自定義對象並訪問.name,在我列舉的for循環中,只要將NSString * str更改爲您的自定義類型,並僅使用name屬性進行所有比較即可。 – Joe

1

,你會爲你的排序方法的選擇與NSDiacriticInsensitiveSearch選項一起使用,更重要的是compare:方法中的所有謊言。

[[yourArray] sortedArrayUsingSelector:@selector(compareTheAddressBookWay:)]; 

現在,你需要添加compareTheAddressBookWay:方法在一個類別

@implementation NSString (YourCategory) 

- (NSComparisonResult) compareTheAddressBookWay:(NSString*)iString 
{ 
    return [self compare:iString 
       options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch 
        range:NSRangeFromString(self) 
} 

@end 

!!重要!!:

使用sortedArrayUsingSelector:將兼容於iOS高達2.0
而使用sortedArrayUsingComparator:僅限適用於iOS 4及以上版本。