Objective C自定义比较:优先级

时间:2015-05-25 07:32:26

标签: ios objective-c

我有一个使用[NSLocale ISOCountryCodes]获得的NSArray国家/地区。如何对此NSArray进行排序,以便我可以将某些常用国家置于列表顶部,同时将其余部分按字母顺序排列?

United States of America
United Kingdom
Singapore
Korea
Japan
Hong Kong
Afghanistan
Albania
Algeria
etc etc..

我目前正在使用caseInsensitiveCompare:来获取字母顺序,但我如何更改它以便我可以指定一个列表放在顶部,而其余的则按字母顺序保存在下面。

3 个答案:

答案 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];