2012-03-28 4 views
7

मैं xcode4.3/Objective-C में एक ऐप बना रहा हूं और NSMutableArray को सॉर्ट करने का प्रयास करते समय एक समस्या आई है। मैं इसे एक स्क्लाइट डेटाबेस से तारों के साथ पॉप्युलेट कर दूंगा। समस्या स्वीडिश पात्रों के साथ होती है, ä और ö।स्ट्रिंग्स में क्या होता है जब मैं तारों की सरणी को क्रमबद्ध रूप से सॉर्ट कैसे कर सकता हूं?

ऑर्ड किए गए सरणी को इस तरह कुछ दिखना चाहिए: जैसे, br, ol, st, år, ög, ös।

लेकिन जब मैं चयनकर्ता का उपयोग करता हूं तो आदेश की तुलना करें यह है: जैसा, år, br, ol, ög, ös, st।

और जब मैं स्थानीयकृत का उपयोग करता हूं तो ऑर्डर में परिवर्तन करें: जैसे, år, br, ög, ol, ös, st।

पुराने धागे के अनुसार स्थानीयकृत कॉम्पैयर समाधान होना चाहिए, लेकिन मैं इसे सही तरीके से काम नहीं कर सकता। यदि मैं SQLite डेटाबेस तक पहुंचने के लिए टर्मिनल का उपयोग करता हूं और ऑर्डर टाइप करता हूं तो मुझे सही परिणाम मिल जाएगा। क्या मेरी समस्या xcode या iphone simulator में कुछ सेटिंग्स से संबंधित हो सकती है, क्योंकि न तो सही क्रम प्रदर्शित करता है? या स्थानीयकृत है गलत रास्ता तय करने के लिए? जब तक यह काम पूरा हो जाता है तब तक मैं खुशी से किसी भी कामकाज को स्वीकार करूंगा। धन्यवाद।

+0

आप कोड है कि आप ऐसा करने के लिए उपयोग करने दे सकते हैं? – David

+0

मैं यह देखने के लिए जांच करूंगा कि 'localizedStandardCompare:' कोई अलग है या नहीं। विफल होने पर, आपको अपने स्वयं के तुलनित्र को लागू करने की आवश्यकता हो सकती है (या चूंकि आप SQLite डीबी का उल्लेख करते हैं ... यदि आप कोर डेटा का उपयोग कर रहे हैं तो आप डीबी को लांच अनुरोध पर सॉर्ट डिस्क्रिप्टर सेट करके सॉर्टिंग कर सकते हैं)। – rickster

+0

स्थानीयकृत तुलना काम करना चाहिए, लेकिन केवल तभी जब आपका लोकेल (आपकी मशीन में) स्वीडन पर सेट हो। मुझे अजीब बात यह है कि अगर मैं सरणी को लॉग करता हूं तो विशेष वर्ण वाले शब्द मुद्रित नहीं होते हैं लेकिन यूनिकोड कोड के रूप में दिखाए जाते हैं। अगर मैं अलग-अलग शब्दों को लॉग करता हूं तो वे सही तरीके से और सही क्रम में लॉग इन करते हैं। – rdelmar

उत्तर

13

आप इसे compare:options:range:locale: का उपयोग कर और स्पष्ट रूप से स्वीडिश स्थान को निर्दिष्ट, इस तरह से काम कर सकते हैं:

NSArray *strings=[NSArray arrayWithObjects:@"as", @"ol", @"st", @"br", @"ög", @"år", @"ös", nil]; 
NSLocale *locale=[[NSLocale alloc] initWithLocaleIdentifier:@"sv_SE"]; 

NSArray *sorted=[strings sortedArrayUsingComparator:^(NSString *first, NSString *second) { 
    return [first compare:second 
        options:0 
        range:NSMakeRange(0, [first length]) 
        locale:locale]; 
}]; 

for (NSString *s in sorted) { NSLog(@"%@", s); } 

उत्पादन होता है:

2012-04-10 08:08:18.139 Untitled[32416:707] as 
2012-04-10 08:08:18.140 Untitled[32416:707] br 
2012-04-10 08:08:18.141 Untitled[32416:707] ol 
2012-04-10 08:08:18.142 Untitled[32416:707] st 
2012-04-10 08:08:18.142 Untitled[32416:707] år 
2012-04-10 08:08:18.143 Untitled[32416:707] ög 
2012-04-10 08:08:18.143 Untitled[32416:707] ös 
संबंधित मुद्दे

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