我有一個字符串數組(名稱)排序NSArray的排序
,我想他們喜歡iPhone上的通訊錄如何對它們進行分類排序
- 例如:伊萊 - >電子商務下
- 如:阿里 - >下的
- 如:4li - >下#
有什麼建議?
我有一個字符串數組(名稱)排序NSArray的排序
,我想他們喜歡iPhone上的通訊錄如何對它們進行分類排序
有什麼建議?
您需要對字符串執行變音不敏感的比較。 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);
,你會爲你的排序方法的選擇與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及以上版本。
是否有可能在一個名爲「name」的屬性的自定義對象數組上執行此操作 –
是在比較內部而不是將obj1作爲'NSString'強制轉換爲自定義對象並訪問.name,在我列舉的for循環中,只要將NSString * str更改爲您的自定義類型,並僅使用name屬性進行所有比較即可。 – Joe