programing

NSSortDescriptor를 사용하여 배열을 정렬합니다.

minimums 2023. 9. 10. 12:05
반응형

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이 먼저 표시됩니다.enter image description here

여기에서 보기: 정렬 설명자 만들기사용

대소문자를 구분하지 않는 것으로 비교할 수 있습니다.

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

반응형