2010-03-22 10 views
5

आप सी में तार ++ है कि इस इस क्रम में हो कर देगा की एक सरणी को क्रमबद्ध कैसे करूँ:सी ++ में स्ट्रिंग सरणी को सॉर्ट करना 'ए' या 'ए' और किसी के साथ, ä ö?

श्री अंका

श्री ब्राउन

श्री सीजर

श्री Donk

श्री ålish

श्री Ätt

श्री दूसरी

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

उत्तर

0

टेबल्स और परिवर्तन।

मैं पहली बार या तो सभी अपरकेस या लोअरकेस करने के लिए स्ट्रिंग में बदल सकते हैं:

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

अगला मैं अपवाद के लिए चेक या समानक तालिका का प्रयोग करेंगे। यदि प्रश्न में वर्ण अपवाद वर्णों की सरणी में है, तो एक समतुल्य तालिका का उपयोग करें।

6

जैसे ही आप मिश्रण में यूनिकोड वर्ण फेंक, आप अंतर्राष्ट्रीयकरण के बारे में सोच शुरू कर दिया है। अलग-अलग भाषाओं में अलग-अलग सॉर्टिंग नियम होते हैं। उदाहरण के लिए, डच में, "आईजे" को एक पत्र माना जाता है और इसकी वर्णमाला में अपना स्थान होता है। मैं यूनिकोड के लिए स्ट्रिंग शाब्दिक तुलना, अर्थात् अंतर्राष्ट्रीय अवयव करने के लिए एक अच्छा यूनिकोड पुस्तकालय की सिफारिश: http://site.icu-project.org/

इसी के साथ

, तो आप बस आईसीयू के तुलनित्र के साथ साधारण std::sort उपयोग कर सकते हैं।

+0

क्या वे यूनिकोड वर्ण हैं, हालांकि - या केवल एक एएनएसआई कोडपेज। वह सब के बाद "स्ट्रिंग" का उपयोग कर रहा है। – Steve314

+2

एन्कोडिंग पर निर्भर करता है। यदि उनकी स्रोत फ़ाइलों को यूटीएफ -8 के रूप में एन्कोड किया गया है, तो 'std :: string' का उपयोग ठीक है, और प्रत्येक घटना को बाइट्स के उपयुक्त अनुक्रम के साथ दर्शाया जाएगा। बोर्क, बोर्क, बोर्क! – Will

+0

मेरा मतलब है कि आपके पास यूनिकोड मानने का कोई कारण नहीं है। std :: wstring अच्छा सबूत होगा कि यूनिकोड उपयोग में था। std :: स्ट्रिंग थोड़ा या तो रास्ता कहता है। – Steve314

0

अतीत में मैंने नामों को क्रमबद्ध करने के लिए स्ट्रिकॉल का उपयोग किया है, जो वर्तमान लोकेल के बाद तारों की तुलना करता है। यद्यपि यह वर्तमान लोकेल में तारों के लिए काम करता है, लेकिन यह तब काम नहीं करता जब आप एक ही डेटाबेस में विभिन्न स्थानों से नामों से निपट रहे हों।

संबंधित मुद्दे