Сортируя массив строк в C++, неважно, или и с å, ä ö?

Как делают Вы сортируете массив строк в C++, который заставит это произойти в этом порядке:

г-н Anka

Коричневый г-на

г-н Ceaser

г-н donK

г-н ålish

Г-н Ätt

г-н önD

//following not the way to get that order regardeless upper or lowercase and å, ä, ö
//in forloop... 
string handle;
point1 = array1[j].find_first_of(' ');
string forename1(array1[j].substr(0, (point1)));
string aftername1(array1[j].substr(point1 + 1));
point2 = array1[j+1].find_first_of(' ');
string forename2(array1[j+1].substr(0, (point2)));
string aftername2(array1[j+1].substr(point2 + 1));
if(aftername1 > aftername2){
    handle = array1[j];
    array1[j] = array1[j+1];
    array1[j+1] = handle;//swapping
}
if(aftername1 == aftername2){
    if(forname1 > forname2){
        handle = array1[j];
        array1[j] = array1[j+1];
        array1[j+1] = handle;   
    }
}
5
задан Chris_45 23 March 2010 в 08:02
поделиться

3 ответа

Таблицы и преобразования.

Сначала я бы преобразовал строку либо во все прописные, либо во все строчные буквы:

#include <cctype>
#include <algorithm>
#include <string>

std::string test_string("mR BroWn");
std::transform(test_string.begin(), test_string.end(),
               test_string.begin(),
               std::tolower);

Затем я бы проверил исключения или использовал таблицу эквивалентности. Если символ, о котором идет речь, находится в массиве символов-исключений, то используйте таблицу эквивалентности.

0
ответ дан 14 December 2019 в 13:32
поделиться

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

0
ответ дан 14 December 2019 в 13:32
поделиться

Как только вы добавите символы Юникода в микс, вы должны начать думать об интернационализации. На разных языках действуют разные правила сортировки. Например, в голландском языке «IJ» считается отдельной буквой и занимает свое место в алфавите. Я рекомендую хорошую библиотеку Unicode для выполнения лексических сравнений строк, а именно Международные компоненты для Unicode: http://site.icu-project.org/

При этом вы можете просто использовать обычный std: : sort с компаратором ICU.

6
ответ дан 14 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: