Сортировка как средство поиска
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, или путем преобразования всех строк прежде, чем запустить вид.
Вы могли ускорить сравнение строк при помощи ключей сопоставления (см. документацию для
UCGetCollationKeyиUCCompareCollationKeys).
Я, и в производственном качественном коде, я был бы, мог получить длину строки и выделить соответственно размерный буфер. Однако это было бы излишеством для выборки, фокус которой идет, как сортировать имена файлов. Кроме того, в производстве кодируют, я предпочел бы предварительно преобразовывать все строки к UTF-16 вместо того, чтобы преобразовать их для каждого сравнения строк.
История версии документа
| Дата | Примечания |
|---|---|
| 04.01.2010 | Обновленный для Mac OS X 10.6, который добавил определенный метод для подобного Средству поиска сравнения строк. |
| 27.10.2004 | Новый документ, показывающий, как сортировать строки как представление списка Средства поиска. |