2011-07-27 16 views
9

मैं तार की एक सरणी है (नाम)क्रमबद्ध NSArray तरह

और मैं उनकी तरह कैसे iphone पर पता पुस्तिका उन्हें क्रमबद्ध करता क्रमबद्ध करना चाहते हैं

  • जैसे: एली -> ई के तहत
  • जैसे: अली -> के तहत एक
  • जैसे: 4li -> #

किसी भी सुझाव के तहत?

उत्तर

11

आपको स्ट्रिंग के खिलाफ एक डायक्रिटिक असंवेदनशील तुलना करने की आवश्यकता है। NSString में compare:options: विधि NSDiacriticInsensitiveSearch के विकल्प के साथ है।

NSArray *array = [NSArray arrayWithObjects:@"éli", @"bob", @"earl", @"allen", @"àli", @"aaron", nil]; 

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [(NSString*)obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch]; 
}]; 

संपादित करें:

यहाँ एक पूर्ण उदाहरण है कि होगा खंड प्रथम वर्ण के आधार पर परिणाम विशेषक असंवेदनशील है। मैंने एक शब्दकोश में रखा है ताकि आपको सही तरीके से प्रदर्शित करने के लिए सॉर्ट की गई कुंजियों का ट्रैक रखना पड़े।

NSArray *array = [NSArray arrayWithObjects:@"éli", @"bob", @"earl", @"allen", @"àli", nil]; 

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [(NSString*)obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch]; 
}]; 

NSMutableDictionary *sectioned = [NSMutableDictionary dictionary]; 
NSString *firstChar = nil; 

for(NSString *str in sorted) 
{ 
    //Ignore empty strings 
    if(![str length])continue; 

    NSMutableArray *names = nil; 

    //Compare the first character using diacritic insensitive search 
    if([str compare:firstChar options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch range:NSMakeRange(0, 1)] == NSOrderedSame) 
    { 
     names = [sectioned objectForKey:firstChar]; 
    } 
    else 
    { 
     //decomposedStringWithCanonicalMapping is where the magic happens 
     //(it removes the accent mark) 
     firstChar = [[str decomposedStringWithCanonicalMapping] substringToIndex:1]; 
     names = [NSMutableArray array]; 
     [sectioned setObject:names forKey:firstChar]; 
    } 

    [names addObject:str]; 
} 

NSLog(@"sorted: %@", sorted); 
//This is sectioned like the address app 
NSLog(@"sectioned: %@", sectioned); 
+0

क्या यह "नाम" –

+0

नामक संपत्ति के साथ कस्टम ऑब्जेक्ट्स की एक श्रृंखला पर ऐसा करना भी संभव है, ओएसजे 1 को 'एनएसएसटींग' के रूप में कास्टिंग करने के बजाय तुलना के अंदर हाँ, इसे अपनी कस्टम ऑब्जेक्ट और एक्सेस .name के रूप में डाला जाता है, वही जाता है लूप के लिए जहां मैं क्रमबद्ध गणना करता हूं, बस अपने कस्टम प्रकार में एनएसएसटींग * स्ट्र को बदलें और नाम संपत्ति के साथ सभी तुलना करें। – Joe

1

compare: विधि आप NSDiacriticInsensitiveSearch विकल्प के साथ और अधिक महत्वपूर्ण बात अपने छँटाई विधि के चयनकर्ता के रूप में इस्तेमाल करते हैं और करेंगे भीतर सब झूठ।

[[yourArray] sortedArrayUsingSelector:@selector(compareTheAddressBookWay:)]; 

अब आप एक वर्ग

@implementation NSString (YourCategory) 

- (NSComparisonResult) compareTheAddressBookWay:(NSString*)iString 
{ 
    return [self compare:iString 
       options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch 
        range:NSRangeFromString(self) 
} 

@end 

में compareTheAddressBookWay: विधि जोड़ने की जरूरत है !! महत्वपूर्ण !!:

sortedArrayUsingSelector: का उपयोग करने के लिए 2.0
जबकि ऊपर iOS के लिए अनुपालन में होगा sortedArrayUsingComparator: का उपयोग केवल आईओएस 4 और उसके बाद के संस्करण के लिए काम करेगा।