【问题标题】:Reorder an NSMutableArray according to another array根据另一个数组重新排序 NSMutableArray
【发布时间】:2013-11-20 22:23:34
【问题描述】:

假设我有两个数组,一个代表另一个所需的顺序。我希望能够将订单应用于数组。

我的理由是这样的。我的应用程序包含一个可以洗牌的播放列表,我希望能够存储洗牌后的索引,以防用户稍后继续给定的播放列表。因此,两个主要要求是我需要能够提取随机播放列表中原始播放列表的索引,然后能够将这些索引重新应用到原始播放列表以重新生成完全相同的随机播放列表(我的随机播放列表方法是随机的,每次都不一样)。

这是我幼稚的做法。我的主要问题是,最有效的方法是什么,以及存储“订单”数组的最佳方式是什么 - 显然使用 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;
}

【问题讨论】:

  • 不是问题的答案,但您可以通过编写 @(theNumber)NSNumber 编写为文字,您可以使用 @[@"this",@"is",@"an",@"array"];NSArray 编写为文字,这也消除了需要到nil 终止数组。

标签: ios objective-c arrays cocoa-touch nsmutablearray


【解决方案1】:

为了完全控制排序过程,我认为最好的方法是使用 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);

顺便说一句,将索引存储在不同的数组中并不是一种低效的方法(想想数据库)。 :)

希望对您有所帮助。

【讨论】:

  • 对我来说似乎很简单!
【解决方案2】:

【讨论】:

  • NSIndexSet 仅代表一个 set 索引。你不能用它来存储元素的order
  • nsindexset 没有排序 - 我希望有一个 NSOrderedIndexSet :(
猜你喜欢
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2020-07-03
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
相关资源
最近更新 更多