Поиск, сравнение и сортировка строк.

Cocoa

Строковые классы предоставляют методы поиска символов и подстрок в строках и сравнения одной строки с другой. Эти методы соответствуют стандарту Юникода, для определения того, что две последовательности символов эквивалентны. Строковые классы предоставляют методы сравнения, которые обрабатывают последовательности символов должным образом, хотя у вас есть возможность указать буквальный поиск, когда эффективность является важнее и вы можете гарантировать некоторую каноническую форму для составления последовательности символов.

Методы поиска и сравнения

Каждый метод поиска и сравнения существует в нескольких вариантах. Простейший вариант это поиск по всей строке или сравннение всей строки. Другие варианты позволяют изменять способ сравнения последовательностей символов, указывая определенный диапазон символов в строке для поиска или сравнения, вы также можете найти и сравнить строки в контексте данной локали.

Основные методы поиска и сравнения:

Метод поискаМетод сравнения
rangeOfString:compare:
rangeOfString:options:compare:options:
rangeOfString:options:range:compare:options:range:
rangeOfString:options:range:locale:compare:options:range:locale:
rangeOfCharacterFromSet: 
rangeOfCharacterFromSet:options: 
rangeOfCharacterFromSet:options:range: 

Поиск строк

Вы можете использовать методы rangeOfString:... для поиска подстроки в объекте приемнике. rangeOfCharacterFromSet:... методы поиска для отдельных символов из поставляемого набора символов.

Подстроки будут найдены только если полностью, содержатся в указанном диапазоне. Если задать диапазон для метода поиска или сравнения и не требовать NSLiteralSearch (см. ниже), диапазон не должен нарушать границы последовательности символов на любом конце, если это произойдет, вы можете получить неправильный результат. (См. описание метода rangeOfComposedCharacterSequenceAtIndex: для кода, который регулирует диапазон на границах последовательности символов)

Вы также можете сканировать строковый объект на числовые и строковые значения, используя экземпляр NSScanner. Более подробную информацию о сканерах, см. раздел "Сканеры". Оба NSString и NSScanner класса кластеров используют NSCharacterSet класс кластер для операций поиска. Более подробную информацию о наборах символов см. в разделе "Наборы символов".

Если вы просто хотите определить, соответствует ли строка содержимому заданного шаблона, вы можете использовать предикат:

BOOL match = [myPredicate evaluateWithObject:myString];

Для дополнительной информации о предикатах см. в руководстве по программированию предикатов.

 

Сравнение и сортировка строк

Методы compare:... возвращают лексический порядок объекта приемника и поставляемой строки. Некоторые другие методы позволяют определить, являются ли две строки равными, или же один префикс или суффикс другой, но у них нет вариантов, которые позволяют задавать параметры или диапазоны поиска.

Простейший метод для сравнения строк, это compare:-это то же самое как вызов compare:options:range: без опций и в полном объеме объекта приемника в качестве диапазона. Если вы хотите задать параметры сравнения (NSCaseInsensitiveSearch, NSLiteralSearch или NSNumericSearch) можно использовать compare:options: а если вы хотите указать язык можно использовать compare:options:range:locale:. NSString также предоставляет различные удобные методы, чтобы позволить вам выполнять общие сравнения, не нужно указывать диапазоны и варианты напрямую, например caseInsensitiveCompare: и localizedCompare:.

Важно: Для показа пользователю отсортированных списков, вы всегда должны использовать локализованные сравнения. Так обычно вместо того, чтобы вызывать compare: или caseInsensitiveCompare: вы должны использовать localizedCompare: или localizedCaseInsensitiveCompare:.

Если вы хотите сравнить строки в том же порядке, как они представлены в Finder, вы должны использовать compare:options:range:locale: пользователя и следующие опции: NSCaseInsensitiveSearch, NSNumericSearch, NSWidthInsensitiveSearch и NSForcedOrderingSearch. Для примера, см. раздел "Сортировка строк, как в Finder".

Опции поиска и сравнения

Несколько методов поиска и сравнения принимают "опции" в качестве аргумента. Это битовая маска, которая добавляет дополнительные ограничения на операцию. Для создания маски, комбинируют следующие опции (не все опции доступны для каждого метода):

Опция поискаЭффект
NSCaseInsensitiveSearchИгнорирует различия регистра между символами
NSLiteralSearchВыполняет сравнение байт-за-байтом. Различные буквально последовательности (например, последовательности символов), которые могли бы считаться эквивалентными считаются не соотвующими. Использование этой опции может резко ускорить некоторые операции.
NSBackwardsSearchВыполняет поиск с конца к началу диапазона.
NSAnchoredSearchВыполняет поиск символов только в начале или в конце диапазона. Если нет совпадений в начале или конце, то ничего не найдено, даже если соответствующие последовательности символов присутствуют где-нибудь в строке.
NSNumericSearchПри использовании с методом compare:options:, группы чисел рассматривается как числовое значение для целей сравнения. Например, Filename9.txt < Filename20.txt < Filename100.txt.

Поиск и сравнение в настоящее время осуществляются с опцией NSLiteralSearch по умолчанию.

Примеры

Поиск префиксов и суффиксов без учета регистра

NSString обеспечивает методы hasPrefix: и hasSuffix: которые вы можете использовать, чтобы найти точное совпадение префикса или суффикса. Следующий пример иллюстрирует, как можно использовать rangeOfString:options: с сочетанием параметров для выполнения поиска без учета регистра.

NSString *searchString = @"age";

NSString *beginsTest = @"Agencies";

NSRange prefixRange = [beginsTest rangeOfString:searchString

    options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];

// prefixRange = {0, 3}

 
NSString *endsTest = @"BRICOLAGE";

NSRange suffixRange = [endsTest rangeOfString:searchString

    options:(NSAnchoredSearch | NSCaseInsensitiveSearch | NSBackwardsSearch)];

// suffixRange = {6, 3}

Сравнение строк

Следующие примеры иллюстрируют применение различных методов сравнения строк и связанные с ними опции. Первый показывает простейший метод сравнения.

NSString *string1 = @"string1";
NSString *string2 = @"string2";
NSComparisonResult result;
result = [string1 compare:string2];
// result = -1 (NSOrderedAscending)

Вы можете сравнивать строки численно с использованием опции NSNumericSearch:

NSString *string10 = @"string10";

NSString *string2 = @"string2";

NSComparisonResult result;

result = [string10 compare:string2];

// result = -1 (NSOrderedAscending)

result = [string10 compare:string2 options:NSNumericSearch];

// result = 1 (NSOrderedDescending)

Вы можете использовать удобные методы (caseInsensitiveCompare: и localizedCaseInsensitiveCompare:) для выполнения сравнения без учета регистра:

NSString *string_a = @"Aardvark";
NSString *string_A = @"AARDVARK";

result = [string_a compare:string_A];
// result = 1 (NSOrderedDescending)

result = [string_a caseInsensitiveCompare:string_A];
// result = 0 (NSOrderedSame)
// эквиваентно [string_a compare:string_A options:NSCaseInsensitiveSearch]
 

Сортировка строк, как в Finder

Следующий пример показывает, как можно сравнивать строки, чтобы выстроить их в так же, как они представлены в Finder. Во-первых, необходимо определить функцию сортировки, которая включает соответствующие варианты сравнения (для эффективности, проходит по региональным настройкам пользователя в зависимости от контекста).

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];
}

Вы передаете функции в качестве параметра sortedArrayUsingFunction:context: текущую локаль пользователя в зависимости от контекста:

NSArray *stringsArray =
   [NSArray arrayWithObjects:
                         @"string 1",
                         @"String 21",
                         @"string 12",
                         @"String 11",
                         @"String 02", nil];

NSArray *sortedArray = [stringsArray 
   sortedArrayUsingFunction:finderSortWithLocale
   context:[NSLocale currentLocale]];

// sortedArray содержит: { "string 1", "String 02", "String 11",
   "string 12", "String 21" }
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac