あるキーつきのオブジェクトの配列があって、別途キーの配列があるとします。
オブジェクトの配列をキー配列の順序でソートしたく、下のように書いたのですが
indexOfObject:のたびに線形探索されていると思うとなんか上手くないなぁと思ってしまいます
もっと上手いやり方があるでしょうか?
NSArray *targetArray = @[ @{ @"object" : @"a", @"key" : @"c" }, @{ @"object" : @"b", @"key" : @"a" }, @{ @"object" : @"c", @"key" : @"b" }, @{ @"object" : @"d", @"key" : @"e" }, @{ @"object" : @"e", @"key" : @"d" }, ];
NSArray *keyArray = @[ @"a", @"b", @"c", @"d", @"e" ];
[targetArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@ => %@", [obj objectForKey:@"key"], [obj objectForKey:@"object"]);
}];
NSArray *sortedArray = [targetArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSUInteger index1 = [keyArray indexOfObject:[obj1 objectForKey:@"key"]];
NSUInteger index2 = [keyArray indexOfObject:[obj2 objectForKey:@"key"]];
return [@(index1) compare:@(index2)];
}];
[sortedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@ => %@", [obj objectForKey:@"key"], [obj objectForKey:@"object"]);
}];