Search code examples
objective-ciosnsmutablearraynsarray

Sort NSArray of custom objects based on sorting of another NSArray of strings


I have two NSArray objects that I would like to be sorted the same. One contains NSString objects, the other custom Attribute objects. Here is what my "key" NSArray looks like:

// The master order
NSArray *stringOrder = [NSArray arrayWithObjects:@"12", @"10", @"2", nil];

The NSArray with custom objects:

// The array of custom Attribute objects that I want sorted by the stringOrder array
NSMutableArray *items = [[NSMutableArray alloc] init];
Attribute *attribute = nil;

attribute = [[Attribute alloc] init];
attribute.assetID = @"10";
[items addObject:attribute];

attribute = [[Attribute alloc] init];
attribute.assetID = @"12";
[items addObject:attribute];

attribute = [[Attribute alloc] init];
attribute.assetID = @"2";
[items addObject:attribute];

So, what I would like to do is use the stringOrder array to determine the sorting of the items array of custom objects. How can I do this?


Solution

  • Hereby, I compare directly the index of obj1.assetID in stringOrder with the index of obj2.assetID in stringOrder (using Objective-C literals for @() to transform NSString => NSNumber)

    [items sortUsingComparator:^NSComparisonResult(Attribute *obj1, Attribute *obj2) {
        return [@([stringOrder indexOfObject:obj1.assetID]) compare:@([stringOrder indexOfObject:obj2.assetID])]
    }];
    

    Or without ObjC literals :

    [items sortUsingComparator:^NSComparisonResult(Attribute *obj1, Attribute *obj2) {
        return [[NSNumber numberWithInt:[stringOrder indexOfObject:obj1.assetID]] compare:[NSNumber numberWithInt:[stringOrder indexOfObject:obj2.assetID]]]
    }];