2010-03-22 44 views
2

我有一個法語字符串數組讓我說:「égrener」和「確切」我想排序它,如égrener是第一個。當我這樣做:用特殊字符對數組進行排序 - iPhone

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor]; 
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors]; 

我得到在列表的末尾é......我該怎麼辦?

感謝

回答

5

有一個在NSString一個方便的方法,可以讓你做這類容易排序:

NSArray *sortedArray = [myArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

NSString的基礎比較法(compare:options:range:locale:)給你如何排序甚至更多的選擇應做完了。

編輯:這裏是很長的故事:

首先,定義一個比較函數。這一個很好的自然字符串排序:

static NSInteger comparator(id a, id b, void* context) 
{ 
    NSInteger options = NSCaseInsensitiveSearch 
     | NSNumericSearch    // Numbers are compared using numeric value 
     | NSDiacriticInsensitiveSearch // Ignores diacritics (â == á == a) 
     | NSWidthInsensitiveSearch; // Unicode special width is ignored 

    return [(NSString*)a compare:b options:options]; 
} 

然後,排序數組。

NSArray* myArray = [NSArray arrayWithObjects:@"foo_002", @"fôõ_1", @"fôõ_3", @"foo_0", @"foo_1.5", nil]; 
    NSArray* sortedArray = [myArray sortedArrayUsingFunction:comparator context:NULL]; 

該示例中的數組包含一些有趣的字符:數字,變音符號和某些來自unicode範圍ff00的字符。最後一個字符類型看起來像一個ASCII字符,但以不同的寬度打印。

使用的比較函數以人類可預測的方式處理所有情況。排序後的數組具有以下順序:

foo_0 
fôõ_1 
foo_1.5 
foo_002 
fôõ_3 
+0

感謝,但我真的不明白我怎麼可以實現和名稱排序呢? – ncohen 2010-03-22 13:55:48

+0

關鍵是區域設置參數。您現在的問題是系統語言環境設置爲英語。你需要它設置爲法語。您可以在系統或應用程序級別爲法語應用程序執行此操作。如果您只是偶爾需要處理法語,則可以將適當的語言環境傳遞給排序,以便現在使用法語而不是英語排序。閱讀Apple Docs中的本地化內容。這聽起來像你會使用它很多。 – TechZen 2010-03-22 14:35:25

+0

不明白它......它不是一個本地化的問題......它是一個數組中特殊字符的問題! – ncohen 2010-03-22 14:36:58