使用比较块对数组排序

时间:2014-06-12 18:20:33

标签: objective-c

如果我有2个NSMutableArrays并且我想要按照另一个的顺序排序一个,我将如何使用比较块执行此操作?第二个数组是由custom objects组成的列表,其中包含一个名为name

的属性
["Alpha","Gamma","Beta","Delta"]  // Order I want

[CustomObj1,CustomObj2,CustomObj3,CustomObj4]; // Order given

CustomObj1.name = "Alpha", CustomObj2.name = "Beta", ... CustomObj4.name = "Gamma"

2 个答案:

答案 0 :(得分:1)

以下是您首选订单中的名称:

    NSArray *order = @[@"Alpha",@"Gamma",@"Beta",@"Delta"];

这是未排序项目的数组:

    NSArray *items = ...;

首先,制作一个字典,将每个名称映射到其首选位置:

    NSMutableDictionary *rankings = [NSMutableDictionary dictionaryWithCapacity:order.count];
    [order enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        rankings[obj] = @(idx);
    }];

然后,通过在排名中查找每个项目的名称来对项目进行排序:

    NSArray *sortedItems = [items sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        CustomObject *item1 = obj1;
        CustomObject *item2 = obj2;
        return [rankings[item1.name] compare:rankings[item2.name]];
    }];

答案 1 :(得分:1)

我会这样做:

NSArray * customOrderStrings = @["Alpha","Gamma","Beta","Delta"];
NSArray * givenOrder = [CustomObj1,CustomObj2,CustomObj3,CustomObj4];

NSMutableDictionary * customOrderDict = [NSMutableDictionary dictionaryWithCapacity:customOrder.count];

for(CustomObject * co in customOrder)
{
    customOrderDict[co.name] = co;
}

NSMutableArray * customOrder = [NSMutableArray arrayWithCapacity:givenOrder.count];

for(NSString * name in customOrderStrings)
{
    [customOrder addObject:customOrderDict[name]];
}

假设: customOrderStrings中的项目是唯一的。 customOrderStrings中的项目与givenOrder中的项目1:1对应。