Технические вопросы и ответы QA1159

Сортировка как средство поиска

Q: Мои отображения приложения список файлов пользователю. Как я могу сортировать этот список как Средство поиска?

A: Мои отображения приложения список файлов пользователю. Как я могу сортировать этот список как Средство поиска?

Начиная с Mac OS X 10.6 можно сортировать как Средство поиска с помощью -[NSString localizedStandardCompare:] метод. При сортировке видимого пользователем списка строк необходимо использовать этот метод, если это доступно.

В более ранних системах нет никакой определенной системной подпрограммы для сортировки списка строк, как Средство поиска делает. Однако Средство поиска использует стандартную системную подпрограмму, UCCompareTextDefault, для сравнения имен файлов, и можно использовать эту подпрограмму для сортировки собственного списка. Перечисление 1 показывает, как сортировать массив строк как Средство поиска путем объединения CFArraySortValues с использующей функцией сравнения UCCompareTextDefault.

  Сравнение перечисления 1 функционирует к виду как Средство поиска

#include <CoreServices/CoreServices.h>
#include <sys/param.h>

static CFComparisonResult CompareLikeTheFinder(
    const void *    val1, 
    const void *    val2, 
    void *          context
)
{
    #pragma unused(context)
    SInt32          compareResult;
    CFStringRef     lhsStr;
    CFStringRef     rhsStr;
    CFIndex         lhsLen;
    CFIndex         rhsLen;
    UniChar         lhsBuf[MAXPATHLEN];
    UniChar         rhsBuf[MAXPATHLEN];

    // val1 is the left-hand side CFString.

    lhsStr = (CFStringRef) val1;
    lhsLen = CFStringGetLength(lhsStr);

    // val2 is the right-hand side CFString.

    rhsStr = (CFStringRef) val2;
    rhsLen = CFStringGetLength(rhsStr);

    // Get the actual Unicode characters (UTF-16) for each string.

    CFStringGetCharacters( lhsStr, CFRangeMake(0, lhsLen), lhsBuf);
    CFStringGetCharacters( rhsStr, CFRangeMake(0, rhsLen), rhsBuf);

    // Do the comparison.

    (void) UCCompareTextDefault( 
          kUCCollateComposeInsensitiveMask
        | kUCCollateWidthInsensitiveMask
        | kUCCollateCaseInsensitiveMask
        | kUCCollateDigitsOverrideMask
        | kUCCollateDigitsAsNumberMask
        | kUCCollatePunctuationSignificantMask,
        lhsBuf, 
        lhsLen,
        rhsBuf, 
        rhsLen,
        NULL,
        &compareResult
    );

    // Return the result. Conveniently, UCCompareTextDefault 
    // returns -1, 0, or +1, which matches the values for 
    // CFComparisonResult exactly.

    return (CFComparisonResult) compareResult;
}

static void SortCFMutableArrayOfCFStringsLikeTheFinder(
    CFMutableArrayRef strArray
)
{
    CFArraySortValues(
        strArray, 
        CFRangeMake(0, CFArrayGetCount(strArray)), 
        CompareLikeTheFinder, 
        NULL
    );
}

Я, и в производственном качественном коде, я был бы, мог получить длину строки и выделить соответственно размерный буфер. Однако это было бы излишеством для выборки, фокус которой идет, как сортировать имена файлов. Кроме того, в производстве кодируют, я предпочел бы предварительно преобразовывать все строки к UTF-16 вместо того, чтобы преобразовать их для каждого сравнения строк.



История версии документа


ДатаПримечания
04.01.2010

Обновленный для Mac OS X 10.6, который добавил определенный метод для подобного Средству поиска сравнения строк.

27.10.2004

Новый документ, показывающий, как сортировать строки как представление списка Средства поиска.