Страницы

Поиск по вопросам

суббота, 16 марта 2019 г.

Сортировка английских и русских слов в NSArray

Нужно отсортировать массив так, чтобы сначала шли слова на Русском, а только потом на Английском. Пробовал разные compare функции localizedCompare: localizedCaseInsensitiveCompare: localizedStandardCompare: и compare:options:range:locale: , не помогло. Подскажите пожалуйста, кто сталкивался Пример: @[Abc, Bcd, Абв, Def, Бвг]; - входящий массив @[Абв, Бвг, Abc, Bcd, Def]; - то что нужно получить


Ответ

Если массив содержит только русские и английские слова, то можно создать 2 вспомогательные строки с английским и русским алфавитом. В сортировке брать первую по индексу букву из слова, приводить к нижнему регистру(если не нужно сортировать слова с большой и маленькой буквы), узнавать к какому языку она принадлежит и сравнивать слова между собой если они одного языка.
Вот так:
NSArray* words = @[@"Abc",@"Bcd",@"Grf",@"Влд",@"Гдр",@"Жзн",@"Hbr",@"Абв",@"Def",@"Бвг",@"Cdf",@"Acf",@"Aba"];
NSString* englishChar = @"abcdefghijklmnopqrstuvwxyz";
NSString* russianChar = @"абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
NSArray* sortWords = [words sortedArrayUsingComparator:^NSComparisonResult(NSString* obj1, NSString* obj2) {
NSString* prefixObj1 = [[obj1 lowercaseString] substringToIndex:1];
NSString* prefixObj2 = [[obj2 lowercaseString] substringToIndex:1];
if ([englishChar containsString:prefixObj1]) {
if ([englishChar containsString:prefixObj2]) { return [obj1 compare: obj2]; } else { return 1; }
} else if ([russianChar containsString:prefixObj1]) {
if ([russianChar containsString:prefixObj2]) { return [obj1 compare: obj2]; } else { return 0; }
}
return [obj1 compare: obj2]; }];

Комментариев нет:

Отправить комментарий