Страницы

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

четверг, 23 января 2020 г.

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

#objective_c #сортировка


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


Ответы

Ответ 1



Если массив содержит только русские и английские слова, то можно создать 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]; }];

Ответ 2



Столкнулся с похожей задачкой, решил ее на js, надеюсь, кому-то будет полезно. var arr =["ФОРМАТЧИСЛО","formatNumber", "test", "лал","QWER"]; arr.sort((a: string, b: string) => { const temp = a.toLowerCase().trim(); return temp.search(/[а-яё]/g) >= 0 ? -1 : temp.search(/[\w]/g) >= 0 ? 1 : 0; });

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

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