2010-03-22 7 views
5

Jak sortować tablicę ciągów w języku C++, które uczynią to się stało w tej kolejności:Sortowanie szyku ciągów w C++ bez względu na "A" lub "a" oraz z å, ä ö?

mr Anka

Brown

mr Ceaser

mR Donk

mr lish

Mr Ętt

mr OND

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

Odpowiedz

0

Tabele i przekształcenia.

bym najpierw przekonwertować ciąg do obu wszystkimi wielkimi lub małymi literami wszystkich:

#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); 

Następny chciałbym sprawdzić wyjątki lub użyć tabeli równoważności. Jeśli dany znak znajduje się w tablicy znaków wyjątków, użyj tabeli równoważności.

6

Jak najszybciej rzucić znaki Unicode w mix, trzeba zacząć myśleć o internacjonalizacji. Różne języki mają różne zasady sortowania. Na przykład w języku niderlandzkim "IJ" jest uważane za pojedynczą literę i ma własne miejsce w alfabecie. Polecam dobrą bibliotekę Unicode do wykonywania porównań leksykalnych, mianowicie International Components dla Unicode: http://site.icu-project.org/

Dzięki temu możesz po prostu użyć zwykłego std::sort z komparatorem ICU.

+0

Czy są to jednak znaki Unicode - lub tylko strona kodowa ANSI. W końcu używa "łańcucha". – Steve314

+2

Zależy od kodowania. Jeśli jego pliki źródłowe są zakodowane jako UTF-8, użycie 'std :: string' jest w porządku, a każde wystąpienie Ęå będzie reprezentowane przez odpowiednią sekwencję bajtów. Börk, börk, börk! – Will

+0

Po prostu mówię, że nie masz powodu, aby zakładać Unicode. std :: wstring byłby dobrym dowodem na to, że unicode był w użyciu. std :: string mówi trochę inaczej. – Steve314

0

W przeszłości używałem stricoll do sortowania nazw, które porównuje ciągi znaków po bieżącym locale. Chociaż działało to na ciągi znaków w bieżącym locale, nie zadziałało to, gdy mamy do czynienia z nazwami z różnych lokalizacji w tej samej bazie danych.

Powiązane problemy