Сортировка массива строк в C ++ независимо от 'A' или 'a' и с помощью å, ä ö? - PullRequest
5 голосов
/ 22 марта 2010

Как вы сортируете массив строк в C ++, чтобы это происходило в следующем порядке:

Мистер Анка

Мистер Браун

г-н Ceaser

mR donK

г-н ålish

Мистер Этт

г-н ö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;   
    }
}

Ответы [ 3 ]

6 голосов
/ 22 марта 2010

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

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

0 голосов
/ 22 марта 2010

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

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

#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 голосов
/ 22 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...