假设我有两个数组,一个表示另一个所需的顺序。我希望能够将订单应用于数组。
我的理由是这样的。我的应用程序包含一个可以改组的播放列表,我希望能够存储混洗的索引,以防用户稍后继续给定的播放列表。因此,两个主要要求是我需要能够在混洗列表中提取原始播放列表的索引,然后能够将这些索引重新应用到原始播放列表以重新生成完全相同的混洗列表(我的随机播放列表)方法是随机的,每次都会有所不同。)
这是我天真的做法。我的主要问题是,最有效的方法是什么,以及存储“订单”数组的最佳方法是什么 - 显然使用NSNumbers数组效率不高,但我仍然是业余爱好者而不是知道如何做得更好。
NSMutableArray *anArray = @[@"this",@"is",@"an",@"array"];
NSArray *numberArray = @[@(1),@(0),@(2),@(3)];
anArray = [self applyOrder:numberArray toArray:anArray];
NSLog(@"%@",anArray);
-(NSMutableArray*)applyOrder:(NSArray *)order toArray:(NSArray *)array
{
NSMutableArray *newArray = [NSMutableArray array];
for(int i =0;i<order.count;i++)
{
[newArray addObject:[array objectAtIndex:[[order objectAtIndex:i]integerValue]]];
}
return newArray;
}
答案 0 :(得分:4)
为了完全控制排序过程,我认为最好的方法是使用NSArray类的sortedArrayUsingComparator:
方法,该方法需要一个块进行比较。您可以使用以下代码进行排序:
NSArray* anArray = @[@"this",@"is",@"an",@"array"];
NSArray* numberArray = @[@(1),@(0),@(2),@(3)];
NSArray* sorted = [anArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSNumber* i = numberArray[[anArray indexOfObject:obj1]];
NSNumber* j = numberArray[[anArray indexOfObject:obj2]];
return [i compare:j];
}];
NSLog(@"%@",sorted);
顺便说一下,将索引存储在不同的数组中根本不是一种低效的方法(想想数据库)。 :)
希望你会发现它有用。
答案 1 :(得分:1)