我有一个使用[NSLocale ISOCountryCodes]
获得的NSArray国家/地区。如何对此NSArray进行排序,以便我可以将某些常用国家置于列表顶部,同时将其余部分按字母顺序排列?
United States of America
United Kingdom
Singapore
Korea
Japan
Hong Kong
Afghanistan
Albania
Algeria
etc etc..
我目前正在使用caseInsensitiveCompare:
来获取字母顺序,但我如何更改它以便我可以指定一个列表放在顶部,而其余的则按字母顺序保存在下面。
答案 0 :(得分:1)
您可以删除不想排序的对象,然后对其余对象进行排序,然后将它们一起添加。 示例代码:
NSMutableArray * allData = [[NSMutableArray alloc] initWithArray:[[NSLocale ISOCountryCodes]]];
NSArray * yourexceptArray;
[allData removeObjectsInArray:yourexceptArray];
NSMutableArray * result = [[NSMutableArray alloc] initWithArray:yourexcepArray];
sortedArray = //Sort the allData as you like,then add it to result
[result addObjectsFromArray:sortedArray]
答案 1 :(得分:1)
与WenchenHuang的答案(有效)相反,我认为你可以在sortedArrayUsingComparator
的帮助下完成。
在块内部只是比较通常的字符串,但如果字符串等于您想要显示更高的代码之一,请返回YES
。
someArray = [someArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([(NSString*)obj1 isEqualToString:@"USA"]) {
return YES;
} else if ([(NSString*)obj1 isEqualToString:@"SOME_OTHER_COUNTRY"]) {
return YES;
}
return [(NSString*)obj1 compare:(NSString*)obj2];
}];
答案 2 :(得分:1)
我会使用排序描述符来完成它。我不喜欢一次又一次地操纵阵列。所以,我在这种情况下最好找到排序描述符。 (只是个人偏好)
步骤1:创建一个优先级为关键的模型类。我的模特课 -
#import <Foundation/Foundation.h>
@interface ISOCountry : NSObject
@property(nonatomic, strong) NSString *countryCode;
@property(nonatomic, retain) NSString *priority;
@end
第2步:正好这样做 -
NSArray *ISOCountryCodes = [[NSArray alloc]initWithArray:[NSLocale ISOCountryCodes]];
NSArray *commonUsedCountries= [[NSArray alloc]initWithObjects:@"NR", @"NG", @"KW", @"ES", nil];
NSMutableArray *arrayToBeSorted = [[NSMutableArray alloc]init];
for(NSString *countryCode in ISOCountryCodes){
ISOCountry *isoCountry = [[ISOCountry alloc] init];
[isoCountry setValue:countryCode forKey:@"countryCode"];
if(![commonUsedCountries containsObject:countryCode]){
[isoCountry setValue:[NSString stringWithFormat:@"%d", 2] forKey:@"priority"];
}
else{
[isoCountry setValue:[NSString stringWithFormat:@"%d", 1] forKey:@"priority"];
}
[arrayToBeSorted addObject:isoCountry];
}
NSSortDescriptor *prioritySort = [[NSSortDescriptor alloc] initWithKey:@"priority" ascending:YES];
NSSortDescriptor *countryCodeSort = [[NSSortDescriptor alloc] initWithKey:@"countryCode" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:prioritySort, countryCodeSort, nil];
NSArray *sortedArray = [arrayToBeSorted sortedArrayUsingDescriptors:sortDescriptors];