मैं तार की एक सरणी है (नाम)क्रमबद्ध NSArray तरह
और मैं उनकी तरह कैसे iphone पर पता पुस्तिका उन्हें क्रमबद्ध करता क्रमबद्ध करना चाहते हैं
- जैसे: एली -> ई के तहत
- जैसे: अली -> के तहत एक
- जैसे: 4li -> #
किसी भी सुझाव के तहत?
मैं तार की एक सरणी है (नाम)क्रमबद्ध NSArray तरह
और मैं उनकी तरह कैसे iphone पर पता पुस्तिका उन्हें क्रमबद्ध करता क्रमबद्ध करना चाहते हैं
किसी भी सुझाव के तहत?
आपको स्ट्रिंग के खिलाफ एक डायक्रिटिक असंवेदनशील तुलना करने की आवश्यकता है। 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);
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 और उसके बाद के संस्करण के लिए काम करेगा।
क्या यह "नाम" –
नामक संपत्ति के साथ कस्टम ऑब्जेक्ट्स की एक श्रृंखला पर ऐसा करना भी संभव है, ओएसजे 1 को 'एनएसएसटींग' के रूप में कास्टिंग करने के बजाय तुलना के अंदर हाँ, इसे अपनी कस्टम ऑब्जेक्ट और एक्सेस .name के रूप में डाला जाता है, वही जाता है लूप के लिए जहां मैं क्रमबद्ध गणना करता हूं, बस अपने कस्टम प्रकार में एनएसएसटींग * स्ट्र को बदलें और नाम संपत्ति के साथ सभी तुलना करें। – Joe