2012-10-24 13 views
8

मैं एक आईओएस UITableView ऑब्जेक्ट को सॉर्ट करने का प्रयास कर रहा हूं। मैं वर्तमान में निम्नलिखित कोड का उपयोग कर रहा:विराम चिह्न को अनदेखा करें (उद्देश्य-सी)

// Sort terms alphabetically, ignoring case 
[self.termsList sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

यह मेरी सूची सॉर्ट करता, मामले की अनदेखी ह्विस्ट। हालांकि, विराम चिह्न को अनदेखा करना भी अच्छा होगा। उदाहरण के लिए:

car 
c.a.t. 
cat 

(यह नहीं है वास्तव में बात दो बिल्लियों (बिल्ली या बिल्ली) की जो पहली बार इतने लंबे समय के रूप में वे क्रमबद्ध रहे हैं आता है,:

c.a.t. 
car 
cat 

इस प्रकार हल कर दिया जाना चाहिए एक दूसरे के बगल में)।

क्या इसके आसपास जाने के लिए कोई आसान तरीका है? मुझे लगता है कि समाधान में स्ट्रिंग से अल्फान्यूमेरिक वर्णों को निकालने में शामिल होगा, फिर उनको तुलना करना, फिर उन्हें वापस अपने पूर्व राज्यों में वापस गैर-अल्फान्यूमेरिक वर्णों के साथ वापस लौटना होगा।

वास्तव में, केवल उन्हीं पात्रों की मैं वास्तव में देखभाल करता हूं (।) लेकिन यदि कोई समाधान है जो आसानी से सभी विराम चिह्नों को कवर करता है तो यह जानना उपयोगी होगा।

नोट: मैंने एक महीने पहले यह exact same question of Java पूछा था। अब, मैं उद्देश्य-सी में एक ही समाधान बना रहा हूं। मुझे आश्चर्य है कि अगर वहाँ आईओएस एपीआई कि यह आसान बनाने के लिए किसी भी चाल उपलब्ध हैं ...

संपादित: मैं विराम चिह्न पट्टी और एक अन्य सरणी जो मैं प्रकार (@tiguero ने सुझाव दिया) को भरने के लिए निम्नलिखित कोड का उपयोग कर की कोशिश की है । हालांकि, मुझे नहीं पता कि अंतिम चरण कैसे करें: वास्तव में दूसरे सरणी के अनुसार पहली सरणी को सॉर्ट करने के लिए।

NSMutableArray *arrayWithoutPunctuation = [[NSMutableArray alloc] init]; 
    for (NSString *item in arrayWithPunctuation) 
    { 
     // Replace hyphens/periods with spaces 
     item = [item stringByReplacingOccurrencesOfString:@"-" withString:@" "]; // ...hyphens 
     item = [item stringByReplacingOccurrencesOfString:@"." withString:@" "]; // ...periods 
     [arrayWithoutPunctuation addObject:item]; 
    } 
    [arrayWithoutPunctuation sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

यह 'arrayWithoutPunctuation' जो क्रमबद्ध किया जाता है प्रदान करता है, लेकिन निश्चित रूप का विराम चिह्न शामिल नहीं है: यहाँ मेरी कोड है। यह कोई अच्छा नहीं है, क्योंकि, अब इसे अच्छी तरह से क्रमबद्ध किया गया है, इसमें अब विराम चिह्न नहीं है जो पहले स्थान पर सरणी के लिए महत्वपूर्ण है। मुझे क्या करना है 'arrayWithPunctuation' को 'arrayWithoutPunctuation' के क्रम के अनुसार क्रमबद्ध करें ... किसी भी मदद की सराहना की।

+1

बस एक कस्टम तुलनित्र का उपयोग करें। –

+0

मेरा जवाब मान्य नहीं है? – tiguero

+0

अभी तक मैं इसे लागू करने में सक्षम नहीं हूं। एक बार जब मैं इसे काम करने के लिए प्राप्त कर सकता हूं तो मैं स्वीकार करूंगा – CaptainProg

उत्तर

9

आप एक NSArray पर एक तुलना ब्लॉक का उपयोग कर सकते है और अपने कोड निम्नलिखित तरह दिखेगा:

NSArray* yourStringList = [NSArray arrayWithObjects:@"c.a.t.", @"car", @"cat", nil]; 
NSArray* yourStringSorted = [yourStringList sortedArrayUsingComparator:^(id a, id b){ 
     NSString* as = (NSString*)a; 
     NSString* bs = (NSString*)b; 

     NSCharacterSet *unwantedChars = [NSCharacterSet characterSetWithCharactersInString:@"\\.:',"]; 
     //Remove unwanted chars 
     as = [[as componentsSeparatedByCharactersInSet: unwantedChars] componentsJoinedByString: @""]; 
     bs = [[as componentsSeparatedByCharactersInSet: unwantedChars] componentsJoinedByString: @""]; 

     // make the case insensitive comparison btw your two strings 
     return [as caseInsensitiveCompare: bs]; 
    }]; 

यह नहीं हो सकता है सबसे कारगर कोड वास्तव में एक अन्य विकल्प पहली बार अपने सरणी पर पुनरावृति करने के लिए हो सकता है और सभी अवांछित वर्ण हटाने और caseInsensitiveCompare विधि के साथ एक selector का उपयोग करें:

NSString* yourStringSorted = [yourStringList sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
+0

मैं अब कई दिनों से इसके साथ संघर्ष कर रहा हूं। मैं आपके दूसरे सुझाव को लागू करने की कोशिश कर रहा हूं (मैं पहले लागू करने के लिए प्रबंधन नहीं कर सका); कृपया मेरी पोस्ट में मेरा संपादन देखें! – CaptainProg

+4

@ कैप्टनप्रोग: टिगुएरो का पहला सुझाव जो आप चाहते हैं उसे पूरा करेगा। –

+0

जैसा कि @iMoses ने किया है, यह मेरे सेटअप के लिए काम नहीं करता है। मुझे नहीं पता कि क्यों, लेकिन पूर्ण-स्टॉप के साथ तार बिना उन समाधानों के बगल में रहते हैं, भले ही मैं किस समाधान का उपयोग करता हूं ... यह निश्चित रूप से इस कोड के कारण होता है, क्योंकि यह केवल एक प्रकार के एल्गोरिदम (किसी भी प्रकार का) करने का प्रयास करने के बाद होता है । तो सॉर्टिंग (किसी तरह का) हो रहा है। गहरी खुदाई करने की कोशिश करेंगे, लेकिन इससे पहले कि मुझे पता चल जाए कि – CaptainProg

1

मेरे समाधान के साथ दो उचित एक कस्टम वस्तु में प्रत्येक स्ट्रिंग समूह के लिए होगा बांध

  • मूल स्ट्रिंग
  • स्ट्रिंग विराम चिह्न

बिना ... और फिर विराम चिह्न के बिना स्ट्रिंग के आधार पर वस्तुओं को सॉर्ट।

उद्देश्य सी के पास ऐसा करने के कुछ आसान तरीके हैं।

NSString *myString; 
NSString *modified; 

पहले,

NSMutableArray *myStrings = [[NSMutableArray alloc] init]; 
[myStrings addObject: ...]; 

फिर एक सरणी के लिए अपने कस्टम वस्तुओं जोड़ने के लिए, काम NSSortDescriptor का उपयोग कर संशोधित चर द्वारा सरणी क्रमबद्ध करें: तो चलो कहते हैं कि हम इस वस्तु में दो तार डालते हैं ।

//You can specify the variable name to sort by 
//Sorting is done according to the locale using localizedStandardCompare 
NSSortDescriptor *mySortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"modified" ascending:YES selector:@selector(localizedStandardCompare:)]; 
[myStrings sortedArrayUsingDescriptors:@[ mySortDescriptor ]]; 

वोला! आपकी वस्तुओं (और तार) क्रमबद्ध हैं।For more info on NSSortDescriptor...

2

इसमें कुछ समय क्लीनर है, और थोड़ा और अधिक कुशल:

NSArray* strings = @[@".....c",@"a.",@"a",@"b",@"b...",@"a..,"]; 
NSArray* sorted_strings = [strings sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSString* a = [obj1 stringByTrimmingCharactersInSet:[NSCharacterSet punctuationCharacterSet]]; 
    NSString* b = [obj2 stringByTrimmingCharactersInSet:[NSCharacterSet punctuationCharacterSet]]; 
    return [a caseInsensitiveCompare:b]; 
}]; 

असली दक्षता के लिए, मैं एक विधि है कि विराम चिह्न पर ध्यान नहीं देता तुलना, ताकि कोई स्मृति आवंटन सिर्फ की जरूरत होगी लिखते हैं की तुलना करें।

+0

यह कोड, टिगुएरो द्वारा पहले कोड की तरह, अभी भी हाइफ़न के साथ मेरी शर्तों को टाइप करता है और बिना उन के ऊपर पूर्ण स्टॉप ... काम करने का प्रयास करेंगे, लेकिन ऐसा लगता है कि बक्षीस पहले – CaptainProg

+0

की समयसीमा समाप्त हो जाएगी, मैंने इसे चेक किया है और यह मेरे लिए ठीक काम करता है, इस सरणी का उपयोग करें, @ [@ "..... c", @ "a", @ "ए।", @ "बी", @ "बी ...", @ "ए ..,"]; यह देता है, ( एक, "एक।", "एक ..,", ख, "ख ...", "..... ग" ) – iDev

+0

@CaptainProg, इस कोड (और @ tiguero's) बस ठीक काम करता है। या तो आपका प्रश्न भ्रामक है या आप कुछ और याद कर चुके हैं। आपकी सॉर्टिंग विधि के विपरीत - यह रिक्त स्थान के साथ विराम चिह्न को प्रतिस्थापित नहीं करता है ताकि "c.a.t." और "बिल्ली" बराबर है, फिर से, आपके कोड के विपरीत जो दो अलग-अलग वजन देगा। –

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