有一個在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
感謝,但我真的不明白我怎麼可以實現和名稱排序呢? – ncohen 2010-03-22 13:55:48
關鍵是區域設置參數。您現在的問題是系統語言環境設置爲英語。你需要它設置爲法語。您可以在系統或應用程序級別爲法語應用程序執行此操作。如果您只是偶爾需要處理法語,則可以將適當的語言環境傳遞給排序,以便現在使用法語而不是英語排序。閱讀Apple Docs中的本地化內容。這聽起來像你會使用它很多。 – TechZen 2010-03-22 14:35:25
不明白它......它不是一個本地化的問題......它是一個數組中特殊字符的問題! – ncohen 2010-03-22 14:36:58