2011-07-27 5 views
9

내가 (이름)정렬 NSArray를 정렬

그리고 난 아이폰에 주소록을 정렬하는 방법처럼 정렬하고 싶은 문자열 배열을 가지고

  • 예 : 엘리 -> E에서
  • 예 : 알리 -> 아래
  • 예 : 4li -> #

어떤 제안에서?

답변

11

문자열에 대해 구별 부호를 사용하지 않는 비교를 수행해야합니다. NSStringNSDiacriticInsensitiveSearch 옵션을 사용하여 compare:options: 방법을 사용합니다.

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, same goes for 루프에서 정렬 된 열거 형에서 NSString * str을 사용자 지정 형식으로 변경하고 name 속성을 사용하여 모든 비교를 수행하면됩니다. – Joe

1

당신이 NSDiacriticInsensitiveSearch 옵션으로 더 중요한 것은 당신의 정렬 방법의 선택으로 사용됩니다 compare: 방법 내의 모든 거짓말.

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

이제 카테고리

@implementation NSString (YourCategory) 

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

@end 

compareTheAddressBookWay: 방법을 추가해야합니다 !! 중요 !! : sortedArrayUsingSelector:를 사용

2.0
하면서까지 iOS 용을 준수합니다 sortedArrayUsingComparator:을 사용하면 에만 iOS 4 이상에서 작동합니다.