NSSortDescriptor를 사용하여 배열을 정렬합니다.
배열 w.r.t 데이터베이스 정렬에 문제가 있습니다.
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"w" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors];
[sorter release];
여기 데이터베이스에는 첫 번째 대문자가 있고 그 대문자 때문에 적절한 정렬된 출력을 보여주지 못합니다.데이터베이스에서 제 테이블열인 r.t "w"로 배열을 정렬합니다.여기 출력 스크린샷을 첨부했는데 c보다 c암이 먼저라고 되어 있는데, 이는 정확하지 않고 대문자로 된 단어 때문에 알파벳 정렬을 하지 않고 있습니다.
예를 들어 소문자에 "able"이 있고 "aCid"가 있으면 Cid가 먼저 표시되고 그 다음에 able이 표시되며, 첫 글자가 대문자일 경우 "able"과 "a"가 먼저 오는 경우도 있습니다.여기에 Aable이 먼저 표시됩니다.
대소문자를 구분하지 않는 것으로 비교할 수 있습니다.
NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]
initWithKey:@"w"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors];
저처럼 NSSortDescriptor만 사용해도 잘 작동했습니다.
NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
-localized StandardCompare: (NSString)을 사용할 것을 제안해도 되겠습니까?
"이 방법은 Finder와 같은 정렬이 적절한 목록 및 테이블에 파일 이름이나 기타 문자열이 표시될 때마다 사용해야 합니다.이 방법의 정확한 정렬 동작은 위치에 따라 다르며 향후 릴리스에서는 변경될 수 있습니다."
작은 글자가 포함된 이름에 따라 배열을 정렬할 때 사용할 수 있습니다.
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"w" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSArray *sortDescriptors = [NSArray arrayWithObject:sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors];
이 코드는 로키, 에이제이, 존, 밥 등 작은 글자를 가진 알파벳에 따라 이름을 정렬하는 데 잘 작동합니다.
이것이 당신에게 도움이 될 것 같습니다.여기에 해당하는 문서가 있습니다: 프로그래밍 가이드
애플이 작성한 이 작은 기능을 추가하세요.
int finderSortWithLocale(id string1, id string2, void *locale)
{
static NSStringCompareOptions comparisonOptions =
NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSRange string1Range = NSMakeRange(0, [string1 length]);
return [string1 compare:string2
options:comparisonOptions
range:string1Range
locale:(NSLocale *)locale];
}
함수 정의를 헤더에 복사해야 합니다. 그렇지 않으면 정렬된 배열에서 컴파일 오류가 발생합니다.
정렬된 배열의 경우 다음 방법을 사용합니다.
[mGlossaryArray sortedArrayUsingFunction:finderSortWithLocale context:[NSLocale currentLocale]];
결과는 다음과 같습니다.
- c
- 선실
- 카페
- 암
- 중국인
- 기독교
- 크리스마스
- 콜라.
이 코드는 제게 잘 작동합니다.
- (void)sortSearchResultWithInDocumentTypeArray:(NSMutableArray *)aResultArray basedOn:(NSString *)aSearchString {
NSSortDescriptor * frequencyDescriptor =[[NSSortDescriptor alloc] initWithKey:aSearchString ascending:YES comparator:^(id firstDocumentName, id secondDocumentName) {
static NSStringCompareOptions comparisonOptions =
NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
return [firstDocumentName compare:secondDocumentName options:comparisonOptions];
}];
NSArray * descriptors = [NSArray arrayWithObjects:frequencyDescriptor, nil];
[aResultArray sortUsingDescriptors:descriptors];
}
ARC 환경에서 브리지 캐스트 등을 처리하고 싶지 않은 경우에 도움이 되는 비교기 블록을 로케일 메서드와 함께 사용하는 Apple의 파인더 정렬의 대체 형식은 다음과 같습니다.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"your_string_key" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) {
NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSRange string1Range = NSMakeRange(0, ((NSString *)obj1).length);
return [(NSString *)obj1 compare: (NSString *)obj2 options: comparisonOptions range: string1Range locale: [NSLocale currentLocale]];
}];
NSArray *sortedArray = [originalArray sortedArrayUsingDescriptors:@[sortDescriptor]];
효율성을 위해 현재 로케일을 로컬 변수에 저장하는 것도 권장합니다.
언급URL : https://stackoverflow.com/questions/5542762/i-want-to-sort-an-array-using-nssortdescriptor
'programing' 카테고리의 다른 글
이 빌드에는 사용되지 않는 Gradle 기능이 사용되어 Gradle 5.0과 호환되지 않습니다. (0) | 2023.09.10 |
---|---|
Mysql 지정한 날짜에 시간 전에 선택 (0) | 2023.09.10 |
필드를 com.sun.proxy로 설정할 수 없습니다.$프록시 (0) | 2023.09.10 |
단일 쿼리에서 모든 테이블 공간 이름, 할당된 크기, 여유 크기, 용량을 가져오는 방법? (0) | 2023.09.05 |
두 데이터 프레임 간의 차이 찾기 (0) | 2023.09.05 |