2010-03-22 14 views
5

Làm thế nào để bạn sắp xếp một mảng các chuỗi trong C++ mà sẽ làm cho điều này xảy ra theo thứ tự này:Sắp xếp một mảng chuỗi trong C++ không có vấn đề 'A' hoặc 'a' và với å, ä ö?

mr Anka

Ông 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; 
    } 
} 

Trả lời

0

Bảng và phép biến đổi.

đầu tiên tôi sẽ chuyển đổi chuỗi thành hoặc là tất cả chữ hoa hoặc toàn chữ thường:

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

Tiếp theo, tôi sẽ kiểm tra các trường hợp ngoại lệ hoặc sử dụng một bảng tương đương. Nếu ký tự được đề cập nằm trong một mảng các ký tự ngoại lệ, thì hãy sử dụng bảng tương đương.

6

Ngay sau khi bạn ném các ký tự unicode vào hỗn hợp, bạn phải bắt đầu suy nghĩ về quốc tế hóa. Các ngôn ngữ khác nhau có các quy tắc sắp xếp khác nhau. Ví dụ, trong tiếng Hà Lan, "IJ" được coi là một chữ cái duy nhất và có vị trí riêng trong bảng chữ cái. Tôi khuyên bạn nên sử dụng một thư viện Unicode tốt để thực hiện so sánh chuỗi từ vựng, cụ thể là các thành phần quốc tế cho Unicode: http://site.icu-project.org/

Với điều đó, bạn có thể sử dụng đơn giản std::sort với bộ so sánh của ICU.

+0

Chúng có phải là các ký tự Unicode hay không - hoặc chỉ là một mã ANSI. Anh ta đang sử dụng "chuỗi" sau tất cả. – Steve314

+2

Tùy thuộc vào mã hóa. Nếu các tệp nguồn của anh ta được mã hóa dưới dạng UTF-8, việc sử dụng 'std :: string' là tốt, và mỗi lần xuất hiện của Äå sẽ được biểu diễn bằng chuỗi byte thích hợp. Börk, börk, börk! – Will

+0

Tôi chỉ đơn giản có nghĩa là bạn không có lý do gì để giả sử Unicode. std :: wstring sẽ là bằng chứng tốt cho thấy unicode đã được sử dụng. std :: string nói một trong hai cách. – Steve314

0

Trong quá khứ tôi đã sử dụng các tên sắp xếp để sắp xếp, so sánh các chuỗi theo ngôn ngữ hiện tại. Mặc dù điều này làm việc cho các chuỗi trong miền địa phương hiện tại, điều này không hoạt động khi bạn đang xử lý các tên từ các miền địa phương khác nhau trong cùng một cơ sở dữ liệu.

Các vấn đề liên quan